Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 Tkinter启动屏幕&;主循环外的多处理_Python_Tkinter_Multiprocessing_Splash Screen_Tk - Fatal编程技术网

Python Tkinter启动屏幕&;主循环外的多处理

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。现在,启动屏幕直到单独的进程完成后才会显示,但随后会出现并与根窗口一起留在屏幕上(即使调用了它的

我已经实现了一个启动屏幕,当我的应用程序在启动时从远程云存储加载数据库时会显示该屏幕。启动屏幕通过调用.update()保持活动状态(上面有一个progressbar),并在单独的加载过程结束后销毁。之后,主循环启动,应用程序正常运行

下面的代码使用python 3.6和tcl/tk 8.5.9在我的Mac上运行良好。然而,在更新到Sierra之后,我被迫将tk更新到ActiveTcl 8.5.18。现在,启动屏幕直到单独的进程完成后才会显示,但随后会出现并与根窗口一起留在屏幕上(即使调用了它的.destroy()方法)

我不明白为什么会发生这种情况以及如何解决它。有人能帮忙吗?谢谢

更新: 如果您超出注释行
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()