如何使用tkinter使按钮中的文本快速重复更改

2024-09-25 02:35:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个图形老虎机,目前正在努力使老虎机“旋转”。但是,这些按钮似乎跳过了所有其他更改,直接进入最终值。我试过利用时间睡觉,但这也不起作用。目前我正在循环第二个函数,但仍然不起作用。 如何确保按钮显示其在整个循环过程中使用的所有值

代码如下:

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

Tags: textselflendefrandomrootresultstk
1条回答
网友
1楼 · 发布于 2024-09-25 02:35:58

如注释中所述,关键是在for循环中使用update_idletasks(),以强制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代码(例如,他们建议将类名大写,在逗号后加一个空格,…)

相关问题 更多 >