Ahoj,
delam jednoduchy programek v Pythonu - Tkinter GUI, ktery se bude starat o zapinani vypinani vzdalenych pocitacu. Pri tvorbe GUI jsem narazil na mensi problem, kdy v ramci mainloopu zavolam programek, ktery blokuje zbytek GUI dokud neskonci. Zkousel jsem experimentovat s metodou after, ale vzdy v momente kdy volana funkce byla casove narocnejsi, zamrzlo cele GUI dokud procedura neskoncila.
Udelal jsem jako priklad jednoduche udelatko s tlacitky start stop, kdy pri startu se spusti ping (parametry jsou zvolene pro tento pripad tak aby to timeoutovalo) Do budoucna chci spoustet celou tridu, ktera bude casove narocnejsi..
Uvedomuji si ze ve smycce mainloop dochazi k vnitrni smycce, ktera brzdi cely program..
Otazka zni. Jakym zpusobem bych mel resit takove moduly v gui, aby nezablokovaly cely program ? V programovani jsem zacatecnik a nejsem si jisty jestli to jde v ramci tkinteru a metody after - popr neceho jineho. (podprocesy,vlakna..)
Ukazkovy kod:
from Tkinter import *
import time
import subprocess
class Gui(Frame):
def __init__(self, parent=None, **kw):
Frame.__init__(self, parent, kw)
self._start=False
# Smycka, ktera brzdi mainloop.
def Cyklus(self):
if self._start:
print 'bezim'
self.after(1000,self.Cyklus)
p=subprocess.call('ping 1.1.1.1')
def Start(self):
self._start=True
print "stikl jsem tlacitko start"
self.Cyklus()
def Stop(self):
self._start=False
print 'skoncil jsem'
def main():
hlavni =Tk()
sw = Gui(hlavni)
sw.pack(side=TOP)
Button(hlavni, text='Start', command=sw.Start).pack(side=LEFT)
Button(hlavni, text='Stop', command=sw.Stop).pack(side=LEFT)
hlavni.mainloop()
if __name__ == '__main__':
main()
Diky, za kazdou radu Honza