|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
想实现一个计算器,代码如下:
- from tkinter import *
- def verify(content):
- if content.find(".")!=-1:
- part1,dot,part2 = content.partition(".")
- return (part1.isdigit()and part2.isdigit()) or( part1.isdigit()and part2=="")
- return content.isdigit() or content==""
- root = Tk()
- testCMD = root.register(verify)
- #分开写不会影响内部元素的放置
- frame1 = Frame(root)
- frame1.pack(side=TOP,padx=10,pady=10)
- frame2 = Frame(root)
- frame2.pack(side=BOTTOM,padx=10,pady=10)
- label1 = Label(frame1,text="第一个数").grid(row=0,column=0,padx=5,pady=5)
- var1 = StringVar()
- #每次内容修改的时候,触发验证,如果返回True,就把内容给var1;%P表示当前内容
- entry1 = Entry(frame1,textvariable=var1,validate="key",
- validatecommand=(testCMD,'%P'))
- entry1.grid(row=0,column=1,padx=5,pady=5)
- label2 = Label(frame1,text="第二个数").grid(row=1,column=0,padx=5,pady=5)
- var2 = StringVar()
- #每次内容修改的时候,触发验证,如果返回True,就把内容给var1;%P表示当前内容
- entry2 = Entry(frame1,textvariable=var2,validate="key",
- validatecommand=(testCMD,'%P')).grid(row=1,column=1,padx=5,pady=5)
- label3 = Label(frame1,text="运算结果").grid(row=2,column=0,padx=5,pady=5)
- var3 = StringVar()
- #每次内容修改的时候,触发验证,如果返回True,就把内容给var1;%P表示当前内容
- entry3 = Entry(frame1,textvariable=var3,state="readonly").grid(row=2,column=1,padx=5,pady=5)
- def getvalue(value):
- entry1.insert(END,value.get())
- pass
- ''' if : #entry1获得焦点
- str1 = str(var1)+str(value.get())
- var1.set(str1)
- elif: #entry2获得焦点
- str1 = str(var2)+str(value.get())
- var2.set(str1)'''
-
-
- buttonlist = []
- for i in range(16):
- var = StringVar()
- if i==3:
- var.set("+")
- elif i==7:
- var.set("-")
- elif i==11:
- var.set("*")
- elif i==12:
- var.set(".")
- elif i==13:
- var.set("0")
- elif i==14:
- var.set("=")
- elif i==15:
- var.set("/")
- elif i==0:
- var.set("7")
- elif i==1:
- var.set("8")
- elif i==2:
- var.set("9")
- elif i==8:
- var.set("1")
- elif i==9:
- var.set("2")
- elif i==10:
- var.set("3")
- else:
- var.set(str(i))
- button = Button(frame2,textvariable=var,command=getvalue(var),
- activebackground = "pink",activeforeground="yellow",width=5,height=3)
- button.grid(row=(i//4),column=(i%4))
- buttonlist.append(button)
- def add():
- var3.set(str(float(var1.get())+float(var2.get())))
- button1 =Button(frame2,text="+",command=add).grid(row=4)
- def sub():
- var3.set(str(float(var1.get())-float(var2.get())))
- button2 =Button(frame2,text="-",command=sub).grid(row=4,column=1)
- def mul():
- var3.set(str(float(var1.get())*float(var2.get())))
- button3 =Button(frame2,text="*",command=mul).grid(row=4,column=2)
- def div():
- var3.set(str(float(var1.get())/float(var2.get())))
- button4 =Button(frame2,text="/",command=div).grid(row=4,column=3)
- root.mainloop()
复制代码
(最下面的四个按钮可以正常执行)
现在的问题是,程序一开始运行,我还没有点击按钮(for循环中的按钮),它就调用了command的回调函数。
然后我再点击按钮就无效。这个是怎么回事?
效果图:
emmmm
放不上来
本帖最后由 ba21 于 2018-12-5 22:04 编辑
花了个把小时来复习研究tkinter才算搞定。
tkinter只是简单的界面,复杂点的功能难以实现。不过你这个问题算是解决了。
command 如何传参:
command = lambda:test(i)
注意点:
循环动态生成的button都因有
1、个自的 StringVar (多个button使用同1个值,另当别论)
2、个自的 绑定的事件 (多个button使用同1个事件做一样的事,另当别论)
3、循环生成的button应用一个list来存放;以便使用的时候调用。
4、最重要的一点, 你如何判断你点了哪一个button?
我这里通过实践发现 button实例 等于 bind事件中 event.widget
也就是 button1 == event.widget
- def test(event):
- for i, b in enumerate(buttonList):
- if b == event.widget: # 通过绑定相同的事件,在事件中判断 button 是否等于 event.widget 判断按了哪个button
- entry1.insert(END,buttonVar[i].get())
-
- buttonList = []
- buttonVar = [] # 每个button都有各自的StringVar
- for i in range(16):
- buttonVar.append(StringVar()) # 为减少循环次数,直接这里添加
- if i==3:
- buttonVar[i].set("+")
- elif i==7:
- buttonVar[i].set("-")
- elif i==11:
- buttonVar[i].set("*")
- elif i==12:
- buttonVar[i].set(".")
- elif i==13:
- buttonVar[i].set("0")
- elif i==14:
- buttonVar[i].set("=")
- elif i==15:
- buttonVar[i].set("/")
- elif i==0:
- buttonVar[i].set("7")
- elif i==1:
- buttonVar[i].set("8")
- elif i==2:
- buttonVar[i].set("9")
- elif i==8:
- buttonVar[i].set("1")
- elif i==9:
- buttonVar[i].set("2")
- elif i==10:
- buttonVar[i].set("3")
- else:
- buttonVar[i].set(str(i))
- button = Button(frame2,textvariable=buttonVar[i],
- activebackground = "pink",activeforeground="yellow",width=5,height=3)
- button.grid(row=(i//4),column=(i%4))
- button.bind("<Button-1>",test)
- buttonList.append(button)
复制代码
|
|