在标签中显示随机选择项目的次数

时间:2019-06-04 06:10:31

标签: python-3.x tkinter

我的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()

2 个答案:

答案 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()