2014-12-24 2 views
0

Я новичок в Python. Я должен был создать графический интерфейс с несколькими меню. При нажатии на конкретное меню должен начинаться новый процесс, и он не должен висеть на пользовательском интерфейсе. Но я не могу этого достичь. После веб-поиска я сделал аналогичный код.Python: создание нового процесса

В этом коде моя цель состоит в том, чтобы сделать «печать глубоко» оператор работает без подвешивания UI (который получает активируется после нажатия (Click Me))

Пожалуйста, помогите мне в этом отношении.

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 я буду контролировать Lab Equipments), поэтому он остается бесконечным во время цикла –

+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

threading НЕ запускает новый процесс - процессы и потоки очень разные. –

+0

Я знаю, что они разные, но в контексте имеет смысл использовать потоки. –

0

Вам не нужно несколько потоков для запуска внешнего процесса. Popen() не ждет завершения дочернего процесса. Он немедленно возвращается. Вот complete code example that starts/stops a tkinter progressbar on the start/end of a subprocess without using threads .


Unrelated: запустить 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 
Смежные вопросы