Python tkinter中的多进程处理

4

如何在Python中运行多个进程而不使用多线程?例如,考虑以下问题:

我们需要制作一个GUI界面,其中有一个“开始”按钮,点击它会启动一个函数(例如打印所有整数),还有一个“停止”按钮,点击它可以停止该函数。

如何在Tkinter中实现此功能?


1
当你说“另一个进程”时,你是否真的意味着另一个进程--生成一个.exe或等效物?或者,当你说“进程”时,你真的是指“其他某个函数”吗?我很难相信你会为了打印整数而有一个完全独立的进程。 - Bryan Oakley
我指的是其他函数。 - Chandan
2
@Chandan:在提出技术问题时,术语非常重要。在这种情况下,“进程”和“函数”之间存在巨大的区别。您应该编辑您的问题以反映您不打算生成其他进程。 - Bryan Oakley
2个回答

4

然后你需要将 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。
我已经阅读了这个之前的问题,我想知道为什么你在这里明确要求不使用多线程解决方案。在Tkinter中,此解决方案可用于其他线程必须与GUI部分通信的情况。例如:在渲染一些图像时填充进度条。
但是,正如评论中指出的那样,这种方法对于仅打印数字来说过于复杂。
您可以在这里找到关于Tkinter的大量信息和更多示例。
编辑: 由于您的新问题已关闭,我将在此更改代码以澄清最后一点。

@BryanOakley我完全同意,但我想使用工作线程是为了处理比打印整数更重要的东西——即处理大量数据,这可能会使GUI阻塞直到它完成。 - A. Rodas
1
问题要求在不使用多线程的情况下如何实现,返回翻译后的文本即可。 - Bryan Oakley
@A.Rodas 怎么不用两个按钮来实现呢?我的意思是当它开始时,我们可以将按钮的文本从“开始”更改为“停止”,当它停止时,将“停止”更改为“开始”? - Chandan
@BryanOakley你说Tkinter不支持多线程,那它是如何工作的呢?(如果我误解了什么,抱歉) - Chandan
2
@Chandan:只要工作线程中没有尝试访问任何Tkinter数据结构,它可能会正常工作。问题在于尝试从多个线程访问GUI对象。 - Bryan Oakley
显示剩余3条评论

0

你尝试使用过 multiprocessing 模块吗?看起来这是你正在寻找的模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接