如何使用Tkinter控制流程?

2024-10-01 22:30:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用tkinter构建一个GUI来控制python脚本

代码看起来像

kansai = Page(kansai_url)
tokyo = Page(tokyo_url)

def loop_main():

    with concurrent.futures.ProcessPoolExecutor() as executor:
        k = executor.submit(kansai.compare)
        t = executor.submit(tokyo.compare)

    kansai_lbl['text'] = k.result()
    tokyo_lbl['text'] = t.result()

    root.after(60000, loop_main)


if __name__ == '__main__':

    root = tk.Tk()

    # --buttons--
    start_btn = tk.Button(root, text='Start', command=loop_main, font='Raleway', bg='#20bebe', fg='white', height=2,
                          width=10)
    start_btn.grid(column=1, row=3)

    refresh_btn = tk.Button(root, text='Refresh', font='Raleway', bg='#20bebe', fg='white', height=2, width=10)
    refresh_btn.grid(column=2, row=3)

    quit_btn = tk.Button(root, text='Quit', command=root.destroy, font='Raleway', bg='#20bebe', fg='white', height=2,
                         width=10)
    quit_btn.grid(column=3, row=3)

    # -- instruction --
    kansai_name_lbl = tk.Label(root, text='Kansai', font='Raleway')
    kansai_name_lbl.grid(column=1, row=0)
    tokyo_name_lbl = tk.Label(root, text='Tokyo', font='Raleway')
    tokyo_name_lbl.grid(column=3, row=0)

    kansai_lbl = tk.Label(root)
    kansai_lbl.grid(column=1, row=1)

    tokyo_lbl = tk.Label(root)
    tokyo_lbl.grid(column=3, row=1)

    root.mainloop()

我的目标是通过startstop按钮控制脚本的运行。脚本编写为loop_main运行多处理,大约需要20秒才能完成

我的问题是,当我单击start时,脚本启动了,但GUI没有响应,我无法单击quit按钮。只有在跑步期间,我才能点击按钮。但是我想随时通过quit按钮退出脚本

我怎样才能解决这个问题


Tags: textname脚本maincolumnroottkgrid
1条回答
网友
1楼 · 发布于 2024-10-01 22:30:01

当应用程序执行函数时,tkinter gui变得无响应,我遇到了一个问题。对我来说,解决方案是“线程化”:

import tkinter
import time
from threading import Thread


def start():
    def something_slow():
        global stop
        stop = False
        while not stop:
            print("doing stuff")
            time.sleep(1)
        print("stoped doing stuff")
    executing = Thread(target=something_slow)
    executing.start()


def stop():
    global stop
    stop = True


main_window_of_gui = tkinter.Tk()
button_start = tkinter.Button(main_window_of_gui, text="Start", command=start)
button_start.grid(row=0, column=0)

button_stop = tkinter.Button(main_window_of_gui, text="Stop", command=stop)
button_stop.grid(row=0, column=1)

main_window_of_gui.mainloop()
stop = True

相关问题 更多 >

    热门问题