使用tkinter为单独的程序编写Python UI。此程序的停止按钮基本上冻结UI并继续执行脚本
这是我的代码使用tkinter为单独的程序编写Python UI。此程序的停止按钮基本上冻结UI并继续执行脚本,python,python-3.x,tkinter,terminate,Python,Python 3.x,Tkinter,Terminate,这是我的代码 import tkinter as tk import subprocess import sys import time import os import tkinter.font as font from tkinter.ttk import * app = tk.Tk() app.geometry("400x400") app.configure(bg='gray') photo = tk.PhotoImage(file=r"C:\Users
import tkinter as tk
import subprocess
import sys
import time
import os
import tkinter.font as font
from tkinter.ttk import *
app = tk.Tk()
app.geometry("400x400")
app.configure(bg='gray')
photo = tk.PhotoImage(file=r"C:\Users\ex\ex_button_active.png")
myFont = font.Font(family='Helvetica', size=20, weight='normal')
tk.Label(app, text='EX', bg='gray', font=(
'Verdana', 15)).pack(side=tk.TOP, pady=10)
app.iconbitmap(r'C:\Users\ex\ex_icon.ico')
start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' &"
subprocess.check_call(cmd, shell=True)
assert (time.time() - start) < 1
p = subprocess.Popen(cmd, shell=True)
def ex_activation():
#Python Code
#Python Code...
def ex_stop():
sys.exit(ex_activation) #This area is basically where I have a button to terminate the other script running.
#I have tried sys.exit() and had the same result
ex_activation_button = tk.Button(app,
bg='black',
image=photo,
width=120,
height=120,
command=ex_activation)
ex_stop_button = tk.Button(app,
bg='Gray',
text='ex',
width=12,
command=ex_stop
height=3)
ex_stop_button['font'] = myFont
app.title("Example")
ex_activation_button.pack(side=tk.TOP)
ex_stop_button.pack(side=tk.LEFT)
app.mainloop()
将tkinter作为tk导入
导入子流程
导入系统
导入时间
导入操作系统
将tkinter.font导入为字体
从tkinter.ttk导入*
app=tk.tk()
附录几何(“400x400”)
应用程序配置(bg='gray')
photo=tk.PhotoImage(file=r“C:\Users\ex\ex\u button\u active.png”)
myFont=font.font(family='Helvetica',size=20,weight='normal')
标签(应用程序,text='EX',bg='gray',字体=(
“Verdana”,15)).pack(侧面=顶部,侧面=10)
app.iconbitmap(r'C:\Users\ex\ex\u icon.ico')
开始=时间。时间()
cmd=sys.executable+“-c”导入时间;time.sleep(2)&”
子进程检查调用(cmd,shell=True)
断言(time.time()-start)<1
p=subprocess.Popen(cmd,shell=True)
def ex_激活():
#Python代码
#Python代码。。。
def ex_stop():
sys.exit(ex_activation)#这个区域基本上是我用来终止另一个脚本运行的按钮。
#我尝试了sys.exit(),得到了相同的结果
ex_激活按钮=传统按钮(应用程序、,
bg='黑色',
图像=照片,
宽度=120,
高度=120,
命令=ex_激活)
ex_stop_button=tk.按钮(应用程序、,
bg='Gray',
text='ex',
宽度=12,
命令=ex_停止
高度=3)
ex_停止按钮['font']=myFont
附录标题(“示例”)
ex_激活按钮组件(侧面=顶部)
ex_stop_按钮组件(侧面=左侧)
app.mainloop()
我正在寻找一种方法,让我的程序停止其他按钮运行的程序。我意识到这可能是一个“自毁按钮”,但我不知道如何使用其他按钮运行的脚本来实现这一点。非常感谢您的帮助!我试图通过将def ex_激活
放在p.kill中来终止代码
这不起作用…如果另一个python脚本被设置为永远运行(有某种类型的
,而True:
),您不能像以前那样在命令行上运行它,因为它会在脚本运行时冻结窗口
为了在后台运行python脚本,您需要使用子流程库。(找出答案)
我还找到了另一个答案,它使用check\u output()
来知道python程序何时完成。如果您想向tkinter应用程序发送状态,这也很有用:例如,您可以打印(“33%完成”)
。您可以将其添加到tkinter的主循环中,以便始终知道程序是否正在运行
最后但并非最不重要的一点是,要终止该进程(使用停止按钮),您应该使用os
,并查找子进程的ID。您还可以找到一个很好的示例
我想试试这样的东西:
cmd=“exec python file.py”
p=subprocess.Popen(cmd,shell=True)
#继续运行tkinter任务。
tk.update()
tk.update_idletasks()#这两行应该在一段时间内为True
#停止二级程序
p、 杀死
编辑
使用问题代码的示例代码。警告:我已经更改了测试的png文件位置,对应用程序图标进行了注释,并且仅在Windows上进行了测试
删除主文件上的mainloop()
,并放置update…()
,以捕获(我不知道为什么)正在杀死父进程和子进程的键盘中断,这一点很重要
我邀请您尝试一下,并像半小时测试后它工作时一样高兴
文件1:daemon.py-此文件将永远运行
从时间导入睡眠
从系统导入退出
尽管如此:
尝试:
打印(“你好”)
睡眠(1)
除键盘中断外:
打印(“再见”)
退出()
文件2:tkinterapp.py-名称是自我解释的
将tkinter作为tk导入
导入子流程
导入系统
导入时间
导入操作系统
将tkinter.font导入为字体
从tkinter.ttk导入*
app=tk.tk()
附录几何(“400x400”)
应用程序配置(bg='gray')
photo=tk.PhotoImage(文件=r“C:\Users\royal\github\randomstofts\baixa.png”)
myFont=font.font(family='Helvetica',size=20,weight='normal')
标签(应用程序,text='EX',bg='gray',字体=(
“Verdana”,15)).pack(侧面=顶部,侧面=10)
#app.iconbitmap(r'C:\Users\ex\ex\u icon.ico')
def ex_激活():
全球职业选手
打印(“正在运行!”)
pro=subprocess.Popen(“python daemon.py”,shell=True)
def ex_stop():
全球职业选手
打印(“停止!”)
os.kill(pro.pid,0)
ex_激活按钮=传统按钮(应用程序、,
bg='黑色',
图像=照片,
宽度=120,
高度=120,
命令=ex_激活)
ex_stop_button=tk.按钮(应用程序、,
bg='Gray',
text='ex',
宽度=12,
command=ex#u stop,#小心你漏掉了一个“,”在这里!!!
高度=3)
ex_停止按钮['font']=myFont
附录标题(“示例”)
ex_激活按钮组件(侧面=顶部)
ex_stop_按钮组件(侧面=左侧)
#app.mainloop()
尽管如此:
尝试:
app.update()
app.update_idletasks()
除键盘中断外:
通过
wait-wait,另一个python脚本包含什么?它也是特金特吗?最好是导入它,而不是执行它。尝试root.destroy()
退出当前脚本另一个python脚本并不是真正的问题。它终止了它。另外,导入python脚本将不允许我的按钮在按下右键时运行它?如果可以的话,我会怎么做?把你所有的代码放在