我的label2应该显示每个项目(这里是苹果)出现多少次 也就是说,如果选择了apple,我的计数器(label2)应显示1,然后显示2、3。 但这似乎不起作用。
from tkinter import*
import random, time
wn=Tk()
wn.geometry("300x300")
mytext=Text(wn,bg="pink",width=10,height=200)
mytext.pack()
label1=Label(wn,text="",bg="yellow",bd=3)
label1.place(x=200,y=20)
label2=Label(wn,text="",bg="lightgreen",bd=3)
label2.place(x=200,y=50)
def update(c=0):
numx = 0
list1=["apple","orange","melon","carrot"]
fruit = random.choice(list1)
label1["text"]=fruit
if label1["text"]=="apple":
numx+=1
label2["text"]=numx
mytext.insert('end', str(fruit) + '\n')
wn.after(1000, update, c+1)
update()
wn.mainloop()
答案 0 :(得分:1)
每次调用numx
时,您将update
定义为零。
首先将numx
移动到update
函数之外,然后在global
内部声明update
:
from tkinter import*
import random, time
wn=Tk()
...
numx = 0
def update(c=0):
global numx
...
update()
wn.mainloop()
答案 1 :(得分:1)
正如@HenryYik指出的那样,您的代码需要首先在全局空间中声明numx = 0
,然后在update
函数内部将其全局声明。
解决问题的另一种方法是使用collections.Counter
;它的优点是简化了update
中的代码逻辑,并且,如果需要的话,还可以保持每个水果被选择的次数。
水果列表也在函数update
之外声明,使代码更通用。
类似这样的东西:
import tkinter as tk
import random
from collections import Counter
def update(delay=1000):
"""picks a fruit at random, and updates the display and the tally
calls itself again after a time delay
"""
fruit = random.choice(fruit_list)
counter[fruit] += 1
label1['text'] = fruit
label2['text'] = counter['apple']
mytext.insert('end', str(fruit) + '\n')
wn.after(delay, update)
fruit_list = ['apple', 'orange', 'melon', 'carrot']
counter = Counter()
wn = tk.Tk()
wn.geometry('300x300')
mytext = tk.Text(wn, bg='pink', width=10, height=200)
mytext.pack()
label1 = tk.Label(wn, text='', bg='yellow', bd=3)
label1.place(x=200, y=20)
label2 = tk.Label(wn, text='', bg='lightgreen', bd=3)
label2.place(x=200, y=50)
update()
wn.mainloop()