Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 停止更换标签_Python_User Interface_Tkinter_Label - Fatal编程技术网

Python 停止更换标签

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

我正在为自己创建一个修订程序,但是每当调用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.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
    是在哪里定义的

  • 我删除了强制调整GUI大小的代码。Tkinter真的很擅长计算大小,所以让它来做它的工作吧。此外,如果您在布局小部件时非常小心,那么在调整窗口大小时,它们将适当地增长和收缩。这意味着您不需要对窗口强制设置最小或最大大小。强制调整大小会带来糟糕的用户体验——用户应该始终能够调整窗口大小以满足其需求

  • 我将小部件的创建与小部件的布局分开。首先,如果要保留对小部件的引用,必须将它们分开。这是因为:
    lbl=label(…).pack()将lbl设置为
    None
    。python就是这样工作的——最后一个函数是保存到变量中的函数,
    pack
    grid
    总是不返回任何值。第二个原因很简单,它使您的代码更易于编写和维护。组织小部件的所有代码都在一个地方,这样更容易看到全局