如何在不停止Tkinter中的Gui的情况下在后台运行进程

时间:2018-01-10 05:43:07

标签: python user-interface tkinter

我正在制作一个gui,代码如下。当我点击gui中的复制按钮时,它会被冻结,直到执行过程,但我想同时做其他过程​​。我对Google进行了一些研究,我知道如果我在后台运行该过程然后这个问题得到了解决。那么请有人告诉我最简单的方法吗?

代码:

import Tkinter as tk
import time
root = tk.Tk()
root.geometry('300x400')

def Number():
   for i in range(100):
   print(i)
   time.sleep(1)

def hello():
   print('Hello')

b = tk.Button(root,text='copy',command = Number)
b.pack()

b = tk.Button(root,text='display',command = hello)
b.pack()


root.mainloop()

预期输出

当我点击复制按钮时,函数Number应该在后台运行而Gui不应该被冻结,同时如果我点击display按钮它应该显示Hello

1 个答案:

答案 0 :(得分:3)

你必须在一个帖子中启动你的号码引用功能。

这是一个非常非常粗略的例子,它对启动的函数何时完成一无所知,允许你同时启动多个计数...如果你想要正确地执行它,你可能想要读入线程。

import Tkinter as tk
import time
import threading

root = tk.Tk()
root.geometry('300x400')

def print_numbers(end): #  no capitals for functions in python
    for i in range(end):
        print(i)
        time.sleep(1)

def print_hello():
    print('Hello')

def background(func, args):
    th = threading.Thread(target=func, args=args)
    th.start()

b1 = tk.Button(root,text='copy',command = lambda : background(print_numbers, (50,))) #args must be a tuple even if it is only one
b1.pack()  #  I would advice grid instead for Tk

b2 = tk.Button(root,text='display',command = print_hello)
b2.pack()

root.mainloop()