You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter按钮无法启动外部Python脚本问题求助

问题分析与修复方案

我一眼就看出问题出在哪啦!你用os.system('cd /home/pi/Desktop/Backup')的时候,这个命令是在一个独立的子shell进程里执行的,执行完这个子shell就直接退出了,根本不会改变你当前Python主进程的工作目录。所以接下来的os.system('python p.py')还是在原来的目录运行,自然找不到p.py啦。

下面给你几个可行的修复方法:

方法一:切换当前进程的工作目录

用os.chdir()直接修改Python进程的工作目录,这样后续的命令就会在目标目录执行了:

from tkinter import *
import os
import sys

def open_SS():
    print('processing')
    # 切换到目标目录
    os.chdir('/home/pi/Desktop/Backup')
    # 现在可以直接运行脚本
    os.system('python p.py')

def close_window():
    master.destroy()

master = Tk()
master.minsize(width=500, height=300)
Button(master, text='Exit', command=close_window).grid(row=12, column=6, sticky=W, pady=4)
Button(master, text='SS', command=open_SS).grid(row=12, column=8, sticky=W, pady=4)
mainloop()

方法二:直接使用脚本的完整路径

不用切换目录,直接在python命令里指定p.py的绝对路径,这样更简单直接:

from tkinter import *
import os
import sys

def open_SS():
    print('processing')
    # 直接用完整路径运行脚本
    os.system('python /home/pi/Desktop/Backup/p.py')

def close_window():
    master.destroy()

master = Tk()
master.minsize(width=500, height=300)
Button(master, text='Exit', command=close_window).grid(row=12, column=6, sticky=W, pady=4)
Button(master, text='SS', command=open_SS).grid(row=12, column=8, sticky=W, pady=4)
mainloop()

方法三:用subprocess模块(推荐)

os.system其实是比较老旧的方法,Python官方更推荐用subprocess模块,它能更好地控制子进程,还能捕获输出、错误信息,方便调试排查问题:

from tkinter import *
import subprocess
import sys

def open_SS():
    print('processing')
    # 使用subprocess.run执行脚本,可指定工作目录并捕获输出
    result = subprocess.run(
        [sys.executable, '/home/pi/Desktop/Backup/p.py'],
        cwd='/home/pi/Desktop/Backup',  # 指定脚本运行的工作目录
        capture_output=True,
        text=True
    )
    # 打印输出和错误信息,方便调试
    print("脚本输出:", result.stdout)
    print("错误信息:", result.stderr)

def close_window():
    master.destroy()

master = Tk()
master.minsize(width=500, height=300)
Button(master, text='Exit', command=close_window).grid(row=12, column=6, sticky=W, pady=4)
Button(master, text='SS', command=open_SS).grid(row=12, column=8, sticky=W, pady=4)
mainloop()

这里用sys.executable是为了确保调用的是当前Python环境的解释器,避免因为系统默认Python版本不同导致兼容性问题。

另外注意你原来的代码最后是mainloop...,要改成mainloop()才是正确的调用方式哦!

内容的提问来源于stack exchange,提问作者C Vith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:55:04