2013-02-24 55 views
3

如何在没有多线程的情况下在python中运行多进程?例如,考虑以下问题: -Python中的多进程tkinter

我们必须创建一个Gui,它有一个启动按钮来启动一个函数(比如打印所有整数),并且有一个停止按钮,以便点击它可以停止该功能。

如何在Tkinter中做到这一点?

+1

当你说“另一个进程”时,你是否意指另一个进程 - 生成一个.exe或相当于?或者,当你说“过程”时,你真的是指“其他功能”吗?我很难相信你会有一个完整的单独的过程来打印整数。 – 2013-02-25 11:40:28

+0

我的意思是其他一些功能。 – Chandan 2013-02-25 18:14:06

+1

@Chandan:在提出技术问题时,术语至关重要。在这种情况下,进程和函数之间存在着巨大的差异。你应该编辑你的问题,以反映你不打算产卵其他进程。 – 2013-02-25 23:55:33

回答

5

然后,您需要将Button小部件与启动工作线程的函数绑定。例如:

import time 
import threading 
import Tkinter as tk 

class App(): 
    def __init__(self, root): 
     self.button = tk.Button(root) 
     self.button.pack() 
     self._resetbutton() 
    def _resetbutton(self): 
     self.running = False 
     self.button.config(text="Start", command=self.startthread) 
    def startthread(self): 
     self.running = True 
     newthread = threading.Thread(target=self.printints) 
     newthread.start() 
     self.button.config(text="Stop", command=self._resetbutton) 
    def printints(self): 
     x = 0 
     while self.running: 
      print(x) 
      x += 1 
      time.sleep(1) # Simulate harder task 

随着self.running的方法,你只能通过改变其值正常结束线程。请注意,在执行printints时,使用多个线程可避免阻塞GUI。

我已阅读this previous question,我想你为什么明确地问这里没有多线程的解决方案。在Tkinter中,该解决方案可用于其他线程必须与GUI部件通信的场景。例如:在渲染一些图像时填充进度条。

但是,正如评论中指出的那样,这种方法对于打印数字来说太复杂了。

Here你可以找到很多关于Tkinter的信息和更多的例子。


编辑:

由于您的新问题已经关闭,我会在这里更改代码澄清最后一点。

+0

线程是对这个问题过于复杂的解决方案。 – 2013-02-25 11:39:27

+0

@BryanOakley我完全同意,但我认为使用工作者线程是为了比打印整数更有意义 - 即处理大量数据,这可能会阻止GUI直到完成。 – 2013-02-25 12:56:53

+0

这个问题具体问到如何做这个_without_多线程。 – 2013-02-25 13:51:00

0

您是否尝试过使用多处理模块?似乎是你正在寻找的人。