tkinter按钮用于调用其他脚本后保持单击状态

问题描述 投票:-1回答:2
import tkinter as tk
from tkinter import filedialog, Text
from subprocess import call
import os

root = tk.Tk()

def buttonClick():
    print('Button is clicked')


def openAgenda():
    call("cd '/media/emilia/Linux/Programming/PycharmProjects/SmartschoolSelenium' && python3 SeleniumMain.py",
         shell=True)
    return


canvas = tk.Canvas(root, height=700, width=700, bg='#263D42')
canvas.pack()

frame = tk.Frame(root, bg='white')
frame.place(relwidth=0.8, relheight=0.8, relx=0.1, rely=0.1)

openFile = tk.Button(root, text='Open file', padx=10,
                     pady=5, fg="white", bg='#263D42', command=openAgenda)

openFile.pack()

root.mainloop()

它调用的脚本将打开一个新的浏览器窗口,在该窗口中输入完文本后,它将打开一个新的浏览器窗口并循环。同时,tkinter按钮在视觉上保持单击状态。

python selenium button tkinter
2个回答
0
投票

Tkinter是单线程的:它一次只能做一件事。在脚本运行时,GUI将被冻结。您将需要执行线程处理,多处理或寻找其他方法来将其他脚本合并到GUI中。


0
投票

您的Tk GUI冻结的原因是因为您所有内容都在1个线程上运行。主循环受到提交功能调用的困扰,该调用必须花费“很长时间”,因此单击该按钮时,您可能会在Tk窗口中看到“不响应”。要解决此问题,您需要生成一个单独的线程以供提交运行,以便mainloop可以继续执行此操作并保持Tk窗口不冻结。

这是使用线程完成的。可以让按钮调用一个函数,该函数启动一个新线程,然后再启动提交,而不是您的按钮直接调用提交。然后创建另一个函数来检查提交线程的状态。您也可以添加状态栏

`将tkinter导入为tk从tkinter导入文件对话框,文本从子流程导入调用导入操作系统导入线程

root = tk.Tk()

def buttonClick():print('单击按钮')

def openAgenda():调用(“ cd'/ media / emilia / Linux / Programming / PycharmProjects / SmartschoolSelenium'&& python3 SeleniumMain.py”,壳=真)canvas.update()返回

def start_Agenda_thread(event):全局议程线程Agenda_thread = threading.Thread(target = openAgenda)Agenda_thread.daemon = TrueAgenda_thread.start()

canvas = tk.Canvas(root,height = 700,width = 700,bg ='#263D42')canvas.pack()

frame = tk.Frame(root,bg ='white')frame.place(relwidth = 0.8,relheight = 0.8,relx = 0.1,depend = 0.1)

openFile = tk.Button(root,text ='Open file',padx = 10,pady = 5,fg =“ white”,bg ='#263D42',command = lambda:start_Agenda_thread(None))

openFile.pack()

root.mainloop()`

© www.soinside.com 2019 - 2024. All rights reserved.