如何同时打开多个Tk()窗口?

时间:2020-05-08 20:24:53

标签: python python-3.x tkinter

我的问题很简单,但是我真的不知道问题是什么。 我试图几乎同时打开多个窗口,但是如果我这样做的话:

from tkinter import *
import threading
import time

class new_window:
    def build(self, killtime):
        self.w = Tk()
        self.w.update()
        time.sleep(killtime)
        self.w.destroy()
    def __init__(self, killtime):
        threading.Thread(target=self.build(killtime)).start()

a = new_window(2)
time.sleep(2)
b = new_window(2)

它的行为不像:“打开,等待,打开” 而是像:“打开,等到被杀死,等待,打开”

我的意思是,延迟是在关闭第一个窗口之后开始的,而不是在窗口启动之后开始的。我以为线程可以帮助我,但事实并非如此。

希望你们当中的一个知道如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

您实际上不需要使用threading模块。

稍后,您可以使用.after()方法打开一个新窗口。

这是您的代码:

from tkinter import *
window = Tk()
window.title("window1")
def open_new_window():
    window2 = Toplevel()
    window2.title("Window2")
window.after(1000, open_new_window)
window.mainloop()

希望这会有所帮助!

编辑:上面的代码打开一个窗口,然后停止执行任何操作。如果您希望新窗口保持打开状态并且之间保持一小段延迟,则可以使用以下代码:

from tkinter import *
window = Tk()
window.title("window1")
def open_new_window():
    window2 = Toplevel()
    window2.title("Window2")

    window.after(1000, open_new_window)
open_new_window()

window.mainloop()

希望这会有所帮助!

答案 1 :(得分:0)

我现在是这样做的。但是我仍然将@TheMaker的答案标记为解决方案,因为它更加紧凑和易于理解。

from tkinter import *
import threading
import time
from random import *

root = Tk()
root.configure(background='black')

root.attributes("-fullscreen", True)

class new_window:
    def build(self, delay, x, y):
        self.w = Tk()
        self.w.title("")
        self.ws = root.winfo_screenwidth() # width of the screen
        self.hs = root.winfo_screenheight() # height of the screen
        self.w.geometry(f"250x100+{int(round(self.ws/100*x))}+{int(round(self.hs/100*y))}")
        self.w.update()
        time.sleep(delay)
    def __init__(self, delay, x, y):
        threading.Thread(target=self.build(delay, x, y)).start()

def rdm(delay, count):  
    i = 1
    while i<=count:
        new_window(delay, randint(1, 100), randint(1, 100))
        i+=1
rdm(0.02, 100)

root.mainloop()