Как сделать так, чтобы текст в кнопке быстро менялся многократно с помощью tkinter - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь сделать графический слот-автомат и в настоящее время работаю над тем, чтобы слоты «вращались». Однако кнопки, кажется, пропускают все другие изменения и go прямо к окончательному значению. Я пытался использовать time.sleep, но это тоже не работает. В настоящее время я перебираю вторую функцию, но она все еще не работает. Как я могу убедиться, что кнопки показывают все значения, которые они приняли в течение всего цикла?

Вот код ниже:

import tkinter as tk,random,time

root=tk.Tk()

results=["@","!","$","W","*","£","#","X","%"]

class spin:
    def __init__(self,rowa,columna,text):
        self.text=text
        self=tk.Button(root, height=1,width=2,text=text)
        self.grid(row=rowa,column=columna)

class spun:
    def __init__(self,rowa,columna,text,com):
        self.text=text
        self=tk.Button(root, height=1,width=15,text=self.text,command=com)
        self.grid(row=rowa,column=columna, columnspan=5)

def rotate():
    for i in range(0,10):
        part2()
        time.sleep(0.00005)


def part2():
    global slot1,slot2,slot3,slot4,slot5
    slot1=spin(1,0,results[random.randint(0,len(results)-1)])
    slot2=spin(1,1,results[random.randint(0,len(results)-1)])
    slot3=spin(1,2,results[random.randint(0,len(results)-1)])
    slot4=spin(1,3,results[random.randint(0,len(results)-1)])
    slot5=spin(1,4,results[random.randint(0,len(results)-1)])




slot1=spin(1,0,"@")
slot2=spin(1,1,"£")
slot3=spin(1,2,"%")
slot4=spin(1,3,"$")
slot5=spin(1,4,"#")

spinner=spun(2,0,"Spin",rotate)

root.mainloop()

1 Ответ

0 голосов
/ 13 февраля 2020

Как указано в комментариях, ключ должен использовать update_idletasks() в for для l oop, чтобы заставить GUI обновляться на каждой итерации.

Ниже приведено предложение о том, как структурировать ваш код. Вместо использования global slot1, ... вы можете создать класс для своего игрового автомата. Как указано в комментариях, вам не нужно пересоздавать кнопки на каждой итерации в rotate(), вам просто нужно изменить их тексты с помощью .configure(text=<new value>). Наконец, я использовал random.choices() для непосредственного рисования случайного значения в списке вместо рисования индекса элемента с помощью random.randint().

import tkinter as tk
import random


class Spinner(tk.Frame):
    def __init__(self, master, results, **kw):
        tk.Frame.__init__(self, master, **kw)
        self.results = results

        self.slots = []
        for i in range(5):
            b = tk.Button(self, height=1, width=2, text=self.results[i])
            b.grid(row=0, column=i)
            self.slots.append(b)

        tk.Button(self, height=1, width=15, text='Spin',
                  command=self.rotate).grid(row=1, columnspan=5)

    def rotate(self):
        for i in range(0, 10):
            for slot in self.slots:
                slot.configure(text=random.choices(self.results))
            self.update_idletasks()  # force GUI to update
            self.after(5)  # tkinter method which pause the GUI, the time is given in ms
                           # it can also be use to schedule a function call (see Tkinter doc)


root = tk.Tk()
results = ["@", "!", "$", "W", "*", "£", "#", "X", "%"]

spinner = Spinner(root, results)
spinner.pack()

root.mainloop()

Примечание. Возможно, вы захотите взглянуть на руководство по стилю PEP 8 , который помогает писать чистый python код (например, они советуют вводить имена классов с большой буквы, ставьте один пробел после запятой, ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...