从Tkinter调用的Python Os函数在转换为.exe时不起作用



小伙子们,需要你们的帮助!

我用Tkinter中的GUI制作了一个非常简单的刽子手游戏,并创建了一个按钮事件,该事件调用以下函数来重新启动游戏。这可以作为Python脚本正常工作,但在使用Pyinstaller将脚本转换为.exe时不起作用。("窗口"是根Tkinter窗口(


def restart_func():
window.destroy()
os.startfile("main.py")
return

如果有任何想法或其他方法,我们将不胜感激。

您应该重新创建window并以最初的方式初始化它。

def restart_func():
global window
window.destroy()
window = tk.Tk()
run_gui_initialization_function()

这通常就是为什么一些应用程序更喜欢OOP而不是函数式编程,因为OOP编程中通常没有全局状态,而对于函数式编程来说,run_gui_initialization_function应该重新初始化所有全局状态变量。

人们这样做的另一种方式是如下

def main():
# do main app here
if __name__ == "__main__":
main()

这样,如果你需要重新启动你的应用程序,你只需要在删除window后再次运行main()

编辑:好吧,这里有一种更容易实现但过于混乱的方法,您可以从可执行文件中启动应用程序的分离版本。。。但这是重新启动应用程序的错误方法,在某些情况下可能会失败。

from subprocess import Popen
import sys
def restart_func():
window.destroy()
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
Popen(sys.executable,start_new_session=True)  # if running as executable
else:
os.startfile("main.py")  # if running as python script

最新更新