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



我试图做的是在单击按钮时,它下面的标签会增加一个。老实说,我一无所获,因为我改变了一件事,我得到了一个错误,我修复了那个错误,我得到了另一个。

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

#!/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()

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

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

#!/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()

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

最新更新