我在使用相当简单的应用程序时遇到了问题。它可以正常运行,但是我希望它的运行速度稍慢一些。
想法是从列表中随机生成一个名称,将其显示,然后每次单击按钮将其从列表中删除。
为了使它更有趣,我希望程序在选择最后一个名字之前先显示几个名字。我为此使用了一个简单的for循环。但是,代码执行得如此之快,最后显示的唯一名称是最后一个。
使用time.sleep()
仅会延迟显示姓氏。没有显示其他名称。
这是我的代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tkinter import *
import random
import time
class Application(Frame):
def __init__(self, master):
""" Initialize the frame. """
super(Application, self).__init__(master)
self.grid()
self.name_list = ["Thorin","Tyler","Jose","Bryson","Joe"]
self.create_widget()
def create_widget(self):
self.lbl = Label(self)
self.lbl["text"] = "Click to spin"
self.lbl["font"] = ("Arial", 24)
self.lbl.grid()
self.bttn = Button(self)
self.bttn["text"]= "Spin"
self.bttn["command"] = self.spin
self.bttn.grid()
def spin(self):
if self.name_list:
for i in range(5):
index = random.randrange(len(self.name_list))
self.lbl["text"] = self.name_list[index]
self.lbl.grid()
self.name_list.pop(index)
else:
self.lbl["text"] = "No more names"
self.lbl.grid()
def main():
root = Tk()
root.title("Click Counter")
root.geometry("600x600")
app = Application(root)
root.mainloop()
if __name__ == '__main__':
main()
这是与GUI编程相关的常见问题。问题的核心是窗口绘图管理器。只要您的函数正在执行,图形管理器就会冻结;在功能结束之前,更新标签的文本不会有明显的效果。因此,如果您在其中for
包含一个sleep(1)
命令的循环,则该方法将冻结所有内容五秒钟,然后在函数最终结束时使用最终值进行更新。
解决方案是使用该after
方法,该方法告诉Tkinter在将来的某个时刻调用指定的函数。不同于sleep
,这为图形管理器提供了更新窗口所需的呼吸空间。
一种可能的方法是用以下方法注册六个事件after
:五个事件用于中间名称标签更新,另一个事件用于最终名称更改和弹出。
def spin(self):
def change_name():
index = random.randrange(len(self.name_list))
self.lbl["text"] = self.name_list[index]
self.lbl.grid()
def finish_spinning():
index = random.randrange(len(self.name_list))
self.lbl["text"] = self.name_list[index]
self.lbl.grid()
self.name_list.pop(index)
if self.name_list:
name_changes = 5
for i in range(name_changes):
self.after(100*i, change_name)
self.after(100*name_changes, finish_spinning)
else:
self.lbl["text"] = "No more names"
self.lbl.grid()
(免责声明:这只是您可能如何使用的一个简单示例after
,可能不适合实际使用。特别是,如果在名称已经旋转的情况下反复按“旋转”按钮,它的行为可能会很差。change_name
和之间的代码重复finish_spinning
非常难看)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句