2014-12-24 34 views
0

我是Python新手。我本来应该创建一个带有多个菜单的GUI。在点击一个特定的菜单时,一个新的进程应该启动,它不应该挂起用户界面。但我无法做到这一点。在网络搜索之后,我制作了类似的代码。Python:创建一个新进程

在这段代码中我的目标是使“打印深”的说法不活跃挂UI(它获取点击后生效(请点击))

请帮我在这方面。

import Tkinter 

class simpleapp_tk(Tkinter.Tk): 
    def __init__(self,parent): 
     Tkinter.Tk.__init__(self,parent) 
     self.parent = parent 
     self.initialize() 

    def initialize(self): 
     self.grid() 

     self.entryVariable = Tkinter.StringVar() 
     self.entry = Tkinter.Entry(self,textvariable=self.entryVariable) 
     self.entry.grid(column=0,row=0,sticky='EW') 
     self.entry.bind("<Return>", self.OnPressEnter) 
     self.entryVariable.set(u"Enter text here.") 

     button = Tkinter.Button(self,text=u"Click me !", 
           command=self.OnButtonClick) 
     button.grid(column=1,row=0) 

     self.labelVariable = Tkinter.StringVar() 
     label = Tkinter.Label(self,textvariable=self.labelVariable, 
           anchor="w",fg="white",bg="blue") 
     label.grid(column=0,row=1,columnspan=2,sticky='EW') 
     self.labelVariable.set(u"Hello !") 

     self.grid_columnconfigure(0,weight=1) 
     self.resizable(True,False) 
     self.update() 
     self.geometry(self.geometry())  
     self.entry.focus_set() 
     self.entry.selection_range(0, Tkinter.END) 

    def OnButtonClick(self): 
     while True: 
      print 'deep' 
    def OnPressEnter(self,event): 
     self.labelVariable.set(self.entryVariable.get()+" (You pressed ENTER)") 
     self.entry.focus_set() 
     self.entry.selection_range(0, Tkinter.END) 

if __name__ == "__main__": 
    app = simpleapp_tk(None) 
    app.title('my application') 
    app.mainloop() 
+0

您使用了'而TRUE'循环 - 什么你真的希望发生?你是否尝试过实际开始一个过程? –

+0

实际上在实际情况下,它应该调用一些需要5分钟才能完成的过程(通过UI,我将控制实验室设备),因此无限期地保持循环 –

+0

您需要做的不仅仅是使用无限循环。您需要等待完成的进程,或者通过在某个计时器回调中或在另一个线程中轮询它。 –

回答

1
import threading 

class simpleapp_tk(Tkinter.Tk): 
    # ............................. 

    def OnButtonClick(self): 
     thr = threading.Thread(target=self.print_deep) 
     thr.start() 

    def print_deep(self): 
     while True: 
      print 'deep' 

如果你想创建你需要创建单独的脚本,将在单独的进程中运行一个新的进程。 我仍然认为更好的解决方案将使用线程。

proc.py

while True: 
    print('deep') 

parent_proc.py

import subprocess 
import sys  

class simpleapp_tk(Tkinter.Tk): 
    # ............................. 

    def OnButtonClick(self): 
     subprocess.Popen(args=['python', 'proc.py'], stdout=sys.stdout]) 
+0

非常感谢您的帮助。 –

+2

线程不会启动新进程 - 进程和线程非常不同。 –

+0

我知道它们不同,但在上下文中使用线程更有意义。 –

0

你不需要多线程启动外部进程。 Popen()不等待子进程结束。它立即返回。这是complete code example that starts/stops a tkinter progressbar on the start/end of a subprocess without using threads


无关:运行while True: print 'deep'; time.sleep(1)不会阻塞GUI(假设print('deep')长期不阻断),你可以使用parent.after()方法:

def OnButtonClick(self): 
    self._step()  

def _step(self): 
    print('deep') 
    self.parent.after(1000, self._step) # call _step in a second