Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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
使用tkinter为单独的程序编写Python UI。此程序的停止按钮基本上冻结UI并继续执行脚本_Python_Python 3.x_Tkinter_Terminate - Fatal编程技术网

使用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脚本将不允许我的按钮在按下右键时运行它?如果可以的话,我会怎么做?把你所有的代码放在