【问题标题】:Time.sleep() function placementTime.sleep() 函数放置
【发布时间】:2023-04-06 08:18:01
【问题描述】:

我遇到的问题是,我尝试使用 time.sleep(3) 将第一个功能(StartUpScr)小部件在屏幕上保留 3 秒,然后删除所有放置在屏幕上的小部件,然后继续放置下一个功能(MenuScr)小部件。我已经成功地使用 destroy() 删除第一个小部件并用第二个小部件替换它们,但是由于某种原因,在函数和主程序的任何地方输入 time.sleep(3) 时,而不是第一个小部件留下3 秒,然后被替换它会延迟程序的启动,产生一个空白屏幕,然后快速闪过第一个屏幕到第二个屏幕。

from tkinter import *
import tkinter
import time



window = tkinter.Tk()                               
window.title("BINARY-SUMS!!!")                      
window.geometry("1000x800")                        
window.wm_iconbitmap('flower3.ico')                 
window.configure(background='lavender')            

def StartUpScr():
    StartUpScr = tkinter.Label(window, text="FIRST-SCREEN!!!",fg = "Aqua",bg = "Lavender",font = ("Adobe Gothic Std B", 90, "bold" )).pack()

StartUpLabel = tkinter.Label(window, text="Developed by Robert Bibb 2016",bg = "Lavender",font = ("Calibri Light (Headings)", 10, "italic" ))
    StartUpLabel.pack()
    StartUpLabel.place(x = 400, y = 775)


def MenuScr():
    StartUpScr = tkinter.Label(window, text="SECOND-SCREEN!!!",fg = "green",bg = "Lavender",font = ("Adobe Gothic Std B", 85, "bold" ))
    StartUpScr.pack()


if __name__ == "__main__":
    StartUpScr()
    time.sleep(3)
    for widget in window.winfo_children():
        widget.destroy()
    MenuScr()

【问题讨论】:

  • 我会为函数和变量使用不同的名称。
  • 您好 Robb,请您向以下回答者提供反馈,好吗?他们看起来都在尽力帮助你。

标签: python time tkinter


【解决方案1】:

time.sleep() 在这里不起作用,因为它会停止程序的执行,您必须使用 after...而且在 GUI 编程中使用 sleep 也是一种不好的做法。

root.after(time_delay, function_to_run, args_of_fun_to_run)

所以在你的情况下它会喜欢

def destroy():
    #destroy here
    for widget in window.winfo_children():
        widget.destroy()

if 语句之后 -

if __name__ == "__main__":
    StartUpScr()
    window.after(3000, destroy)
    MenuScr()

【讨论】:

  • 这不太对——MenuScr() 将立即运行。你应该创建一个既破坏原屏幕又创建新屏幕的函数,或者使用after在3001毫秒内调用MenuScr()
【解决方案2】:

所以我们定义了三个函数:firstScreensecondScreenchangeScreen。这个想法正在运行 firstScreen 并在 3 秒后运行 changeScreen,这将破坏当前父窗口 (master) 并创建下一个全新的父窗口 (master2),它将调用 secondScreen,它已经完全新世界。事情就是这样发生的:

from tkinter import *
root = Tk()
import time

class App:
    def __init__(self, master):
        self.master = master
        self.master.geometry("500x500-500+50")

    def firstScreen(self):
        self.master.title("FIRST SCREEN")
        self.label1 = Label(self.master, width=50, height=20,
                            text="This is my FIRST screen", bg='red')
        self.label1.pack()
        self.master.after(3000, self.changeScreen)

    def secondScreen(self):
        self.label2 = Label(self.master, width=50, height=20,
                            text="This is my SECOND screen", bg='yellow')
        self.label2.pack()

    def changeScreen(self):
        self.master.destroy()
        self.master2 = Tk()
        self.master2.title('SECOND SCREEN')
        myapp = App(self.master2)
        myapp.secondScreen()

myapp = App(root)
myapp.firstScreen()

希望对你有帮助!

【讨论】:

  • 为什么要销毁并重新创建根窗口?为什么不只创建一个根窗口,并让每个屏幕成为一个框架?虽然我认为创建和销毁多个根窗口是无害的,但 tkinter 旨在拥有一个在程序生命周期中存在的单个根窗口。
  • @BryanOakley 你是对的,欢迎你编辑我的代码。我实际上想使用框架来做到这一点。但我只是根据问题的主体选择了这种方式:“我已经成功地使用 destroy() 删除第一个小部件并用第二个小部件替换它们”。所以我认为问题就在那里。很高兴看到提出问题的用户的反馈。
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
相关资源
最近更新 更多