更新按钮上的标签单击tkinter / python

时间:2018-01-17 00:24:07

标签: python tkinter

我试图做的是点击按钮后,它下方的标签增加1。我老实说无处可去,因为我改变了一件事并且我得到了一个错误,我修复了这个错误而我得到了另一个错误。

下面是我的代码示例,我不知道我做错了什么:

#!/usr/bin/env python3
from tkinter import *
from tkinter import ttk

count1=0
count2=0
count3=0

    def vote(voting)
         voting.set +=1
         lbl1.set(text= count1)
         lbl2.set(text=count2)
         lbl3.set(text=count3)
 root = Tk()
 frame = ttk.Frame(root)
 b1 = ttk.Button(frame, text="v1", command=vote(count1))
 b1.grid(row=2,column=1)
 b2 = ttk.Button(frame, text="v2", command=vote(count2))
 b2.grid(row=2,column=2)
 b3 = ttk.Button(frame, text="v3", command=vote(count3))
 b3.grid(row=2,column=3)
 lbl1 = ttk.Label(frame, text=count1)
 lbl2 = ttk.Label(frame, text=count2)
 lbl3 = ttk.Label(frame, text=count3)
 lbl1.grid(row=3,column=1)
 lbl2.grid(row=3,column=2)
 lbl3.grid(row=3,column=3)
 frame.grid(column = 0, row = 0, sticky = (N, W, E, S))
 root.mainloop()

1 个答案:

答案 0 :(得分:1)

首先,命令参数必须是函数,而不是函数的结果,因此它不能包含()。如果必须传递参数,则需要创建辅助函数。您可以使用functools.partial或lambda动态地执行此操作,但在这种情况下,我认为以正常方式简单地生成3个辅助函数更容易。

其次,使用IntVar会容易得多,因此Label会自动更新。我想你无论如何都想这样做,因为set()是一个Variable方法,而不是Label方法。

#!/usr/bin/env python3
from tkinter import *
from tkinter import ttk

def vote1():
    count1.set(count1.get() + 1)
def vote2():
    count2.set(count2.get() + 1)
def vote3():
    count3.set(count3.get() + 1)

root = Tk()
count1=IntVar()
count2=IntVar()
count3=IntVar()

frame = ttk.Frame(root)
b1 = ttk.Button(frame, text="v1", command=vote1)
b1.grid(row=2,column=1)
b2 = ttk.Button(frame, text="v2", command=vote2)
b2.grid(row=2,column=2)
b3 = ttk.Button(frame, text="v3", command=vote3)
b3.grid(row=2,column=3)
lbl1 = ttk.Label(frame, textvariable=count1)
lbl2 = ttk.Label(frame, textvariable=count2)
lbl3 = ttk.Label(frame, textvariable=count3)
lbl1.grid(row=3,column=1)
lbl2.grid(row=3,column=2)
lbl3.grid(row=3,column=3)
frame.grid(column = 0, row = 0, sticky = (N, W, E, S))
root.mainloop()

然而,这将是一个子类的理想位置,它将这些东西捆绑在一个新的可重用小部件中。

#!/usr/bin/env python3
from tkinter import *
from tkinter import ttk

class Mick(Frame):
    def __init__(self, master=None, text='', **kwargs):
        Frame.__init__(self, master, **kwargs)

        self.var = IntVar()
        btn = ttk.Button(self, text=text, command=self.vote)
        btn.grid(row=0,column=0)
        lbl = ttk.Label(self, textvariable=self.var)
        lbl.grid(row=1,column=0)

    def vote(self):
        self.var.set(self.var.get() + 1)

root = Tk()
frame = ttk.Frame(root)
for i in range(4): # set number of voting boxes here
    b1 = Mick(frame, text='v'+str(i))
    b1.grid(row=0, column=i)
frame.grid(column = 0, row = 0, sticky = (N, W, E, S))
root.mainloop()

现在,您可以轻松扩展它以制作任意数量的投票块!