3 Sub-Fragen:
[1] Python GUIs sind Abfrage basiert?
Es scheint mir, dass sowohl tk als auch qtpy polling-basiert sind, wenn die GUI eine Funktion aufruft, die eine Weile braucht, um die gesamte GUI zu hängen.
Ich habe vor langer Zeit über Gui gelernt, erinnerte ich mich, dass moderne GUI sollte Interrupt-basierte sein, auch wenn Gui etwas großes ausgeführt, sollte Gui die ganze Zeit reagieren. gui kann das Ergebnis aus diesen großen Berechnungen nicht angezeigt werden, aber es wird reagieren Taste, um die Größe, zeigen Sie auf Animation usw. Also meine Frage ist, gibt es eine Option, wie:
Python3, Verstehen der "GUI-Schleife" wie in tkinter-Hauptschleife() oder QtPy-exec_()
#psuedo code
root=tkinter.Tk()
root.setInterruptMode(True)
[2] Ist Tk.mainloop() nur eine gigantische Schleife?
Wenn meine erste Frage ein Pipe-Traum ist, und ich nur über Threading und Multiprozess erfahren muss, dann ist meine nächste Frage über root.mainloop()
(oder qtpys exec_()
).
Mein Eindruck ist, dass Mainloop() nicht wirklich einen Thread oder irgendetwas in Python startet, es packt einfach eine gigantische und unsichtbare Tkinter's GUI-Polling + Malschleife in meine Hauptzeile. Ist mein Eindruck richtig?
[3] warum Hauptleitung in Hauptleitung setzen?
Muss sich mainloop()
in der Hauptleitung befinden? kann ich es fädeln/multiprocessing? damit sich meine Main-Linie auf große Berechnungen konzentrieren kann und die Main-Linie die GUI-Prozesse und IO-Prozesse regelt. Alle Beispiele, die ich gefunden habe, haben mainloop()
in der Hauptleitung, ich bin nicht sicher, dass es ein empfohlener Ansatz ist oder was die Vorteile sind.
Im Folgenden wird der Code, den ich schrieb bei dem Versuch, über Python gui zu lernen:
import tkinter
import random
class myGUI():
def __init__(self, arg_tkroot):
self.GUI_display = tkinter.Label(arg_tkroot, text='init-ed')
self.GUI_button = tkinter.Button(arg_tkroot, text='click')
self.GUI_display.pack()
self.GUI_button.pack()
self.GUI_button.bind('<Button-1>', self.handle_user_interaction)
self.list_bigData = []
#handles GUI interaction, and call bigData_and_bigCalculation()
def handle_user_interaction(self, arg_event):
print(arg_event, ' detected by myGUI')
strResult_toFeedbackToUser = self.bigData_and_bigCalculation()
self.GUI_display.config(text=strResult_toFeedbackToUser)
print('finished handling user interact')
# slow calculations and memory consuming operations
def bigData_and_bigCalculation(self):
self.list_bigData[:]=[]
for i in range(500000):
self.list_bigData.append(''.join(random.choice('asdfas') for k in range(10)))
return self.list_bigData[-1]
# Main()
if __name__ == '__main__':
root = tkinter.Tk()
mygui = myGUI(root)
root.mainloop()
Nun, wenn Sie einen langen Job im GUI-Thread ausführen, wird die GUI einfrieren. Um dies zu vermeiden, erstellen Sie verschiedene Threads für verschiedene Jobs. – ForceBru
interessante Frage; Ich habe über 10 kleine und eine durchschnittliche Größe App in Tk geschrieben (keine in Qt) hatte nie Reaktionsfähigkeit Isues und dachte nie über eine Art und Weise Tk ist es GUI :) Ich empfehle ForceBru adwise im Allgemeinen zu folgen; und übrigens habe ich Kivy für meine GUI-Apps verwendet, kann empfehlen, es ist flexibler als Tk und funktioniert auch gut auf Android und iOS. – Drako
Ich hatte Angst, Threading und Multiprozess zu verwenden ist unvermeidlich. Aber in meiner ersten Teilfrage, was ich vorher über "interrupt" -basiertes gui (Java-Applet damals) gelernt habe, habe ich nie auf gui freeze zurückgegriffen, das war ein falscher Eindruck, weil wir nie große Berechnungen gemacht haben, während wir diese Dinge gelernt haben? – YunliuStorage