отображение в метке количества раз, когда элемент выбирается случайным образом - PullRequest
0 голосов
/ 04 июня 2019

Мой ярлык2 должен отображать, сколько раз появляется каждый элемент (здесь яблоко) То есть если выбрано яблоко, мой счетчик (label2) должен отображать 1, затем 2, три .. Но, похоже, это не работает.

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 ]

1 голос
/ 04 июня 2019

Как указал @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()
1 голос
/ 04 июня 2019

Вы определили 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...