Python 停止更换标签
我正在为自己创建一个修订程序,但是每当调用fun1函数时,它都会在先前执行的函数下面打印出来。e、 g标签将打印在最后一个标签下面,而不是替换它,有什么想法吗?任何帮助都将不胜感激Python 停止更换标签,python,user-interface,tkinter,label,Python,User Interface,Tkinter,Label,我正在为自己创建一个修订程序,但是每当调用fun1函数时,它都会在先前执行的函数下面打印出来。e、 g标签将打印在最后一个标签下面,而不是替换它,有什么想法吗?任何帮助都将不胜感激 #Imports moduals used from tkinter import * import time import random #Sets GUI gui = Tk() gui.geometry("500x500") gui.maxsize(width=500, height=500) gui.mins
#Imports moduals used
from tkinter import *
import time
import random
#Sets GUI
gui = Tk()
gui.geometry("500x500")
gui.maxsize(width=500, height=500)
gui.minsize(width=500, height=500)
#Sets list of facts
def t():
print("hi")
facts = ['fact one','true', 'fact two','abc']
#Defines random fact generator
def fun1():
r = random.randrange(len(facts))
lbl = Label(gui,text=facts[r]).pack()
btnt = Button(text="True", command=t).pack()
btnf = Button(text="False", command=t).pack()
gui.after(5000, fun1)
gui.after(5000, fun1)
mainloop()
概述
编写此类程序的最佳方法是只创建一次标签或按钮,然后使用configure
方法更改标签的文本
使用程序样式
下面是一个基于原始代码的示例:
#Imports moduals used
from tkinter import *
import time
import random
#Sets GUI
gui = Tk()
gui.geometry("500x500")
gui.maxsize(width=500, height=500)
gui.minsize(width=500, height=500)
def t():
print("hi")
#Defines random fact generator
def fun1():
r = random.randrange(len(facts))
lbl.configure(text=facts[r])
gui.after(5000, fun1)
#Sets list of facts
facts = ['fact one','true', 'fact two','abc']
# create the widgets
lbl = Label(gui,text="")
btnt = Button(text="True", command=t)
btnf = Button(text="False", command=t)
# lay out the widgets
lbl.pack(side="top", fill="x", expand=True)
btnt.pack(side="left", fill="x")
btnf.pack(side="right", fill="y")
# show the first fact; it will cause other
# facts to show up every N seconds
fun1()
mainloop()
使用面向对象的样式
由于您刚刚开始,让我建议一种更好的方法来组织代码。Python本质上是面向对象的,因此将应用程序设为对象是有意义的。即使您可能不熟悉类和对象,但如果您从这个模式开始并遵循几个简单的规则,您可以不费吹灰之力就获得面向对象的所有好处
唯一需要记住的是,在主类中,所有函数都需要将self
作为第一个参数,并且在调用函数时使用self.function
并省略self
作为参数(python会为您这样做)。除此之外,您几乎可以在类中编写普通代码
下面是一个例子:
import tkinter as tk
import random
class Example(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.facts = ['fact one','true', 'fact two','abc', 'a long fact\non two lines']
self.label = tk.Label(self,text="", width = 40, height=4)
self.true_button = tk.Button(self, text="True", command=self.t)
self.false_button = tk.Button(self, text="False", command=self.t)
self.label.pack(side="top", fill="both", expand=True, pady=40)
self.true_button.pack(side="left", fill="x")
self.false_button.pack(side="right", fill="x")
self.fun1()
def t(self):
print("hi")
def fun1(self):
r = random.randrange(len(self.facts))
self.label.configure(text=self.facts[r])
self.after(5000, self.fun1)
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()
以下是一些需要注意的事项:
将tkinter导入为tk
这需要稍微多键入一点,但它会使程序更加健壮。这样做的副作用(在我看来这是一个很好的副作用)是所有tkinter命令现在都需要加上前缀tk
(例如:tk.Button
)。在我看来,这是一种比盲目地将tkinter中的所有内容作为一组全局变量和函数导入要好得多的方法。我知道教程必须显示tkinter import*中的,但它们被误导了
self
是t
、fun1
和\uuuuuu init\uuuuu
的参数,这是python类的一个要求。这只是你怎么做的。还要注意,我们称它们为self.fun1
,而不仅仅是fun1
。这让python知道您想要调用与当前对象关联的函数。一旦程序变得更大,就更容易知道fun1
是在哪里定义的lbl=label(…).pack()将lbl设置为None
。python就是这样工作的——最后一个函数是保存到变量中的函数,pack
和grid
总是不返回任何值。第二个原因很简单,它使您的代码更易于编写和维护。组织小部件的所有代码都在一个地方,这样更容易看到全局