Python基于Tkinter的二输入规则器(乞丐版)

Python 2.7
IDE Pycharm 5.0.3


有想法就去做,等等等等就没机会了

起因

昨天接触了Tkinter框架,之后就迫不及待的想写个计算器出来,结果呢,可想而知了,当初自己犟脾气,掌握几个语法后就想什么都不参考写自己的一段四则运算器出来,结果。。。。。。花了我一天时间,我竟然歪打正着写了个规则器出来窝草。。。。


对比

贴个图,别人家的计算器是这样的;而且用了五十行,说的貌似很了不起的样子(老纸的规则器,只要40-就可以!不算上Scrollbar,分割子框架这类的)

你们认为的‘计算器’

大家计算器都一个模样,大家都是一个idea么?还是局限于计算机就应该这样,本小白不服!


吼吼

But

我的规则器是这样的。。。。

规则器

我知道布局排丑了,不要在意这些细节好么0.0

说说优点

1,以计算器角度说,能完美实现计算,而且带标号,记录存储等功能,知道上一步计算结果。

2,最大的优点在于二输入,调用各种def的函数,而四则运算只是最简单的函数而已,比如说我又写了字符串连接函数,相似度比较函数等等,做个实例而已,大家可以大开脑洞


缺点

1,需要键盘输入,与普通计算器按键输入不同

2,我的代码冗余量比较大,因为自己需要看懂,所以不像别的教程那样直接跟着lambda和pack,一长串的,不利于我们这种小白读。等我水平再高一些,或许我也会采用lambda,这样才够pythontic~


后续

1.本身在做分类聚类方面的课题,结合这个规则器,我完全可以把k-means中的k参数在交互界面上输入,这样就不用每次上程序里面改了!还有DBSCAN里面的Eps和MinPts也可以直接用这个框架!!想想有点小激动呢!(挖的坑不计其数)

2.需要优化下布局,尝试用grid来做,感觉pack里面参数略多啊。


构思框架

放代码之前,先来设计思路,我设计了两个框架,输入和输出在两个框架上,这样便于写代码思路清晰,框架大概是这样的;


框架结构

代码

此代码(就算再烂)绝此一家,别无分店哈哈

#-------------------二输入规则计算器--------------------
#Author:哈士奇说喵(第一次署名有点怕)
# -*- coding: utf-8 -*-
from Tkinter import *
import difflib
#主框架部分
root = Tk()
root.title('乞丐版规则器0.0')
root.geometry()
Label_root=Label(root,text='规则运算(根框架)',font=('宋体',15))

#-----------------------定义规则------------------------

def Plus(a,b):
    return round(a+b, 2)

def Sub(a,b):
    return round(a-b,2)

def Mult(a,b):
    return round(a*b, 2)

def Div(a,b):
    return round(a/b, 2)

def P_str(a,b):
    return a+b

def Rep(a,b):
    return difflib.SequenceMatcher(None,a,b).ratio()
    #difflib可以看看其中的定义,计算匹配率的

#还可以继续增加规则函数,只要是两输入的参数都可以
#----------------------触发函数-----------------------

def Answ():#规则函数

    if lb.get(lb.curselection()).encode('utf-8') == '加':
        Ans.insert(END,'规则:+ ->'+str(Plus(float(var_first.get()),float(var_second.get()))))
    if lb.get(lb.curselection()).encode('utf-8')=='减':
        Ans.insert(END,'规则:- ->'+str(Sub(float(var_first.get()),float(var_second.get()))))
    if lb.get(lb.curselection()).encode('utf-8')=='乘':
        Ans.insert(END,'规则:x ->'+str(Mult(float(var_first.get()),float(var_second.get()))))
    if lb.get(lb.curselection()).encode('utf-8')=='除':
        Ans.insert(END,'规则:/ ->'+str(Div(float(var_first.get()),float(var_second.get()))))
    if lb.get(lb.curselection()).encode('utf-8')=='字符串连接':
        Ans.insert(END,'规则:字符串连接 ->' +P_str(var_first.get(),var_second.get()).encode('utf-8'))
    if lb.get(lb.curselection()).encode('utf-8')=='字符串相似度':
        Ans.insert(END,'规则:字符串相似度 ->'+str(Rep(var_first.get(),var_second.get())))

    #添加规则后定义规则函数

def Clea():#清空函数
    input_num_first.delete(0,END)#这里entry的delect用0
    input_num_second.delete(0,END)
    Ans.delete(0,END)#text中的用0.0


#----------------------输入选择框架--------------------
frame_input = Frame(root)
Label_input=Label(frame_input, text='(输入和选择框架)', font=('',15))
var_first = StringVar()
var_second = StringVar()
input_num_first = Entry(frame_input, textvariable=var_first)
input_num_second = Entry(frame_input, textvariable=var_second)

#---------------------选择运算规则---------------------
#还可以添加其他规则

lb = Listbox(frame_input,height=4)
list_item=['加', '减', '乘', '除','字符串连接','字符串相似度']
for i in list_item:
    lb.insert(END,i)

#---------------------计算结果框架---------------------
frame_output = Frame(root)
Label_output=Label(frame_output, text='(计算结果框架)', font=('',15))
Ans = Listbox(frame_output, height=5,width=30)#text也可以,Listbox好处在于换行


#-----------------------Button-----------------------

calc = Button(frame_output,text='计算', command=Answ)
cle = Button(frame_output,text='清除', command=Clea)


#---------------------滑动Scrollbar-------------------
scr1 = Scrollbar(frame_input)
lb.configure(yscrollcommand = scr1.set)
scr1['command']=lb.yview

scr2 = Scrollbar(frame_output)
Ans.configure(yscrollcommand = scr2.set)
scr2['command']=Ans.yview


#-------------------------布局------------------------
#布局写在一块容易排版,可能我low了吧
Label_root.pack(side=TOP)
frame_input.pack(side=TOP)
Label_input.pack(side=LEFT)

input_num_first.pack(side=LEFT)
lb.pack(side=LEFT)
scr1.pack(side=LEFT,fill=Y)
input_num_second.pack(side=RIGHT)

frame_output.pack(side=TOP)
Label_output.pack(side=LEFT)
calc.pack(side=LEFT)
cle.pack(side=LEFT)
Ans.pack(side=LEFT)
scr2.pack(side=LEFT,fill=Y)

#-------------------root.mainloop()------------------

root.mainloop()

Tkinter还是比价好上手的,知道一些基本语法就可以实现自己想要的效果了,这里我把自己遇到的问题写一下,如果也有人遇到,恰好能帮助的话,我很荣幸。


问题&解决

1.Q.button或插件不显示
A.记得加上pack显示函数!!一般我都定义完了插件直接补上 pack函数


2.Q.插件位置显示问题
A.这个要看你的pack函数写在哪了,所以我一般直接写在最后,容易排序,比如side都是LEFT的话,就按先后顺序显示的


3.Q.刚开始键入的被get之后,直接运算出错。
A.结果是str类型,所以记得用float强制转换,不用int是因为int做除法时候不好使,需要float,切记(python2.7)


Pay Attention

1.在自定义规则的时候,主要get抓到的数据类型和你的def里面的数据类型,保持一致。


2.清空函数中,text和entry,listbox的delect清空不一样!比如被实例的是Listbox(Entry)的,那么清空是Obj.delect(0,END),而如果是Text的对象,那么就是Obj.delect(0.0,END),这个是我之前没想到的,只有实践过才记得住把。而且,用listbox好处在于计算一个值之后,下一个值自动换行,用text时候\n还不好使


吐槽

好了,今天就酱紫咯,老纸后天要开题了窝草,哭了。。。。


狗带
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容