为什么使用os.startfile调用Python脚本时会打开编辑器而非执行
问题解决:Tkinter菜单点击按钮运行Python游戏脚本
你当前遇到的情况是因为系统中.py后缀文件的默认打开程序绑定了代码编辑器,os.startfile默认会调用系统默认程序打开文件,所以点击按钮只会打开脚本源码,而不是运行脚本。
首先修正你现有代码的基础错误:
你当前的代码缺少tkinter的导入声明,首先需要在代码头部加入:
import tkinter as tk
方案1:推荐使用subprocess调用Python解释器运行脚本(更稳定可控)
这个方案不需要依赖系统文件关联,适配性更强,修改后的代码如下:
import os import tkinter as tk import subprocess import sys main = tk.Tk() main.title("Minigames") main.geometry("450x400") main.resizable(width=False, height=False) def forwardtoo(): # sys.executable会自动获取当前运行main.py的Python解释器路径,避免环境匹配问题 subprocess.Popen([sys.executable, 'C:/Users/Windows/PycharmProjects/GUI with minigames/number_guesser.py']) main.destroy() b1 = tk.Button(main, text="Number Guesser", command=forwardtoo) b1.place(x=170, y=250) main.mainloop()
方案2:如果你坚持使用os.startfile,参数说明与写法
你提到的几个参数含义如下:
operation:指定要执行的操作,默认值为open即可满足运行需求,其他常用值还有print(打印文件)、runas(管理员权限运行)arguments:传给要打开的可执行程序的参数,这里我们要调用Python解释器运行脚本,就把游戏脚本的完整路径填在这里cwd:指定程序运行的工作目录,如果你的游戏脚本里有用相对路径读取资源的需求,填脚本所在的文件夹路径即可,无特殊需求可以留空show_cmd:指定程序窗口的显示状态,默认就是正常显示,一般不需要修改
对应的代码修改如下:
import os import tkinter as tk import sys main = tk.Tk() main.title("Minigames") main.geometry("450x400") main.resizable(width=False, height=False) def forwardtoo(): os.startfile( sys.executable, arguments='C:/Users/Windows/PycharmProjects/GUI with minigames/number_guesser.py', cwd='C:/Users/Windows/PycharmProjects/GUI with minigames/' ) main.destroy() b1 = tk.Button(main, text="Number Guesser", command=forwardtoo) b1.place(x=170, y=250) main.mainloop()
额外优化建议
对于Tkinter多窗口项目,更合理的实现方式是不需要拆分成两个独立脚本运行,你可以把猜数字游戏的逻辑封装成函数或类,在main.py中直接导入调用,销毁主窗口后直接加载游戏窗口,不需要开启新进程,也不会有路径适配问题:
- 把number_guesser.py里的代码封装为
start_game()函数 - 在main.py中导入该函数:
from number_guesser import start_game - 点击按钮时直接调用
start_game()再销毁主窗口即可
内容的提问来源于stack exchange,提问作者Prime
相关产品推荐
相关产品推荐

