【问题标题】:How to open a new Tkinter window in a while loop?如何在while循环中打开一个新的Tkinter窗口?
【发布时间】:2022-08-23 00:10:16
【问题描述】:

如何在 while 循环中创建一个新的 Tkinter 窗口?

Tkinter 对我来说有点陌生,所以我想要一些简单的解释。我希望它在 while 循环中打开一个 Tkinter 窗口。基本上,用户对一个问题说是,然后弹出一个新窗口,它会再次询问问题,并且应该再次弹出等等...... 我有一些“代码”,基本上可以表达我的意思。那里的所有其他问题都对我不起作用。 我很愚蠢,没有包含代码

#import modules
import time
import sys
from tkinter import *
from tkinter import ttk
from playsound import playsound
from threading import Thread

win = Tk()

win.geometry(\"900x350\")

def lift_window():
   win.lift()
   win.after(1000, lift_window)

def sound_play():
    playsound(\'a sound\')

while True:
   start = input(\"make new window? (y/n): \")
   if start == \"y\":
      Label(win, text=\"new window!\", font=(\'Aerial 16 italic\')).place(x=5, y=140)

      Thread(target = lift_window).start()
      Thread(target = sound_play).start()

      lift_window()
      win.mainloop()
   elif start == \"n\":
      print(\"ok\")
      sys.exit()

我收到的一些错误消息是

_tkinter.TclError: can\'t invoke \"label\" command: application has been destroyed

但仅此而已。

  • 发布您的代码。
  • 请提供足够的代码,以便其他人可以更好地理解或重现该问题。

标签: python tkinter


【解决方案1】:

错误消息的措辞相当糟糕。它所说的“应用程序”只是win 指向的Tk 实例。关闭窗口时它会被破坏,因此每次循环都需要创建一个新窗口。

while True:
    start = input("make new window? (y/n): ")
    if start == "y":
        win = Tk()
        win.geometry("900x350")
        Label(win, text="new window!", font=('Aerial 16 italic')).place(x=5, y=140)
        win.mainloop()

请注意,win 被销毁也会影响lift_window 中的win.liftwin.after 调用。我不完全确定你在那里尝试做什么(你两次调用lift_window,一次来自一个新线程,每次调用都会设置一个计时器来再次调用它?),所以我无法评论如何修复那部分。

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2018-05-11
    • 2018-05-18
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多