Python Tkinter启动屏幕&;主循环外的多处理
我已经实现了一个启动屏幕,当我的应用程序在启动时从远程云存储加载数据库时会显示该屏幕。启动屏幕通过调用.update()保持活动状态(上面有一个progressbar),并在单独的加载过程结束后销毁。之后,主循环启动,应用程序正常运行 下面的代码使用python 3.6和tcl/tk 8.5.9在我的Mac上运行良好。然而,在更新到Sierra之后,我被迫将tk更新到ActiveTcl 8.5.18。现在,启动屏幕直到单独的进程完成后才会显示,但随后会出现并与根窗口一起留在屏幕上(即使调用了它的.destroy()方法) 我不明白为什么会发生这种情况以及如何解决它。有人能帮忙吗?谢谢 更新: 如果您超出注释行Python Tkinter启动屏幕&;主循环外的多处理,python,tkinter,multiprocessing,splash-screen,tk,Python,Tkinter,Multiprocessing,Splash Screen,Tk,我已经实现了一个启动屏幕,当我的应用程序在启动时从远程云存储加载数据库时会显示该屏幕。启动屏幕通过调用.update()保持活动状态(上面有一个progressbar),并在单独的加载过程结束后销毁。之后,主循环启动,应用程序正常运行 下面的代码使用python 3.6和tcl/tk 8.5.9在我的Mac上运行良好。然而,在更新到Sierra之后,我被迫将tk更新到ActiveTcl 8.5.18。现在,启动屏幕直到单独的进程完成后才会显示,但随后会出现并与根窗口一起留在屏幕上(即使调用了它的
self.overrideredirect(True)
,则启动屏幕将正确显示。然而,我不想要窗口装饰,它仍然停留在脚本末尾的屏幕上。但是,它正在内部销毁,任何进一步调用self.splash
(例如.winfo\u…
-methods)的方法都会导致\u tkinter.TclError:错误的窗口路径名“!splashscreen”
此外,该代码在windows和tcl/tk 8.6下运行良好。这是Mac上tcl/tk 8.5.18的窗口管理的错误/问题吗?显然,这是由于在调用
OverrideDirect(True)
后窗口未由窗口管理器装饰时,窗口堆叠顺序有问题。这似乎也发生在其他平台上
使用Python 3.6.1和tcl/tk 8.5.18在macOS 10.12.5上运行以下代码,单击“打开”按钮后不会出现顶级窗口:
import tkinter as tk
class TL(tk.Toplevel):
def __init__(self):
tk.Toplevel.__init__(self)
self.overrideredirect(True)
# self.after_idle(self.lift)
tl_label = tk.Label(self, text='this is a undecorated\ntoplevel window')
tl_label.grid(row=0)
b_close = tk.Button(self, text='close', command=self.close)
b_close.grid(row=1)
def close(self):
self.destroy()
def open():
TL()
root = tk.Tk()
label = tk.Label(root, text='This is the root')
label.grid(row=0)
b_open = tk.Button(root, text='open', command=open)
b_open.grid(row=1)
root.mainloop()
取消注释行self.after\u idle(self.lift)
可以解决问题(只需调用self.lift()
也可以。但是使用after\u idle()
防止窗口在移动到其位置并调整大小之前闪烁几秒钟,这是我在tkinter中反复遇到的另一个问题,让我一直想知道是否应该继续学习PyQT或PySide2
至于在我最初的问题中关闭未装饰的窗口的问题:在空闲(window.destroy())之后而不是window.destroy()调用似乎也解决了这个问题。我不明白为什么
如果其他人复制了这一点,并且有人提示我在哪里报告这一错误,我很乐意这样做。您的代码在我这方面可以正常工作。我使用的是2017年3月21日发布的python 3.6.1。顺便说一句,您不应该在tkinter中使用
sleep()。在()之后使用instead@SierraMountainTech谢谢,我目前正在使用python 3.6.0,并将尝试更新。after()/sleep():我知道,这只是在一个单独的进程中用于模拟目的。请告诉我更新是否解决了您的问题。如果有机会,我会看看3.6.0。更新到Python3.6.1不会改变任何事情,问题仍然存在。欢迎进一步提示可能的错误!
import tkinter as tk
class TL(tk.Toplevel):
def __init__(self):
tk.Toplevel.__init__(self)
self.overrideredirect(True)
# self.after_idle(self.lift)
tl_label = tk.Label(self, text='this is a undecorated\ntoplevel window')
tl_label.grid(row=0)
b_close = tk.Button(self, text='close', command=self.close)
b_close.grid(row=1)
def close(self):
self.destroy()
def open():
TL()
root = tk.Tk()
label = tk.Label(root, text='This is the root')
label.grid(row=0)
b_open = tk.Button(root, text='open', command=open)
b_open.grid(row=1)
root.mainloop()