English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Einleitung
Der praktische Kurs begann, ja, der Lehrer kam und las den PPT, dann sagte er: Fangen wir an..........
Dann begann ich den Weg der GUI von Python, ich hatte vorher noch nie visuelle Oberflächen von Python verwendet (obwohl das nicht sehr klug ist)
Aber es fühlt sich jetzt recht bequem an, kleine Werkzeuge zu schreiben, und die erste Bibliothek, die ich fand, war Tkinter, also habe ich direkt angefangen zu schreiben
Später fand ich heraus, dass QT sehr gut ist, also werde ich den nächsten Experiment mit QT durchführen. Und was die Tkinter (python angeht3.6)
Kalkulationsquellcode ennn.....Die Namensgebung ist nicht standardisiert......
Zunächst wird die Implementierung des Stacks in Python durch die Methode der Liste simuliert
pop() aus dem Stapel, append() in den Stapel
Lassen Sie uns zunächst die häufig verwendeten Kernkomponentenklassen von Tkinter betrachten:
Kleinkomponentenklasse | Beschreibung |
---|---|
Button | Button |
Canvas | Strukturierte Grafik, zur Zeichnung von Grafiken, Erstellung von Grafikeditoren und Implementierung von benutzerdefinierten kleinen Komponentenklassen |
Checkbutton | Klickt man auf den Checkboxbutton, wird der Wert zwischen den Werten umgeschaltet |
Entry | Textfeld oder auch Textbox |
Frame | Behälter (kann andere kleine Komponenten enthalten) |
Label | Text oder Bild anzeigt |
Menu | Menüleiste, die Dropdown- und Pop-up-Menüs anzeigt |
Menubutton | Menüknopf der Dropdown-Liste |
Message | Ähnlich wie ein Label zur Anzeige von Text, aber der Text wird automatisch in die angegebene Breite und Höhe eingefügt |
Radiobutton | Radiobutton |
Text | Formatierte Textanzeige, unterstützt die Einbettung von Bildern und Texten, ermöglicht die Anzeige und Bearbeitung von Texten in verschiedenen Stilen und Eigenschaften |
Ein Fenster starten
Wenn man etwas visuell macht, denkt man sicherlich zuerst an das Fenster
Das Fenster besteht aus vielen Bestandteilen, wie z.B. title, ico, size, bd, Menüs usw.
import tkinter import os from tkinter import * class Calculator(object): """Rechner""" def __init__(self): self.tk=tkinter.Tk() #Instanziierung self.tk.title('Rechner') self.tk.minsize(370,460) self.tk.maxsize(400,400) #man kann auch self.tk.resizable(0, 0) verwenden, um die Größenveränderung zu verbieten self.tk.iconbitmap(os.getcwd())+'/favicon.ico') def start(self): self.tk.mainloop() if __name__ == '__main__': NewCalculator=Calculator() NewCalculator.start()
Hier wurde ein grundlegendes Fenster erstellt, für die Funktion von mainloop() darin
Wenn wir es löschen, verschwindet das Fenster in einem Blitz, es ist dazu da, um solche Situationen zu verhindern
Bereichsdisplay
Nachdem der Rechner erstellt wurde, muss zunächst das Ergebnis angezeigt werden, hier muss eine Anzeigefläche generiert werden
Natürlich fallen wir auch sehr natürlich auf die Schriftartenkonfigurationen der anzuzeigenden Inhalte zurück, spezifische Beispiele finden Sie im folgenden Code
.... import tkinter.font as tkfont .... #字体设置 self.EntryFont=tkfont.Font(self.tk, size=)13) self.ButtonFont=tkfont.Font(self.tk, size=)12) #Panelanzeige self.count=tkinter.StringVar() self.count.set('0') self.label=tkinter.Label(self.tk,bg='#EEE9E9',bd='3',fg='black',anchor='center',font=self.EntryFont,textvariable=self.count) self.label.place(y=10,width=380,height=40) ....
In tkinter gibt es einige Parameter für das Panel Lable, die hier verwendeten Parameter sollten in der Regel den gängigen Anforderungen gerecht werden
Darin ist bg der Hintergrundfarbe, fg der Vordergrundfarbe, um die Farbe des Inhalts zu ändern, anchor ist die Position des Inhalts im Panel, wie im folgenden Bild gezeigt
Richtung | Beispiel | Tabelle |
---|---|---|
nw | n | ne |
w | center | e |
sw | s | se |
Bezüglich der Positionierung des Panels und der Button dahinter können viele Methoden verwendet werden, place kann genau positionieren, auch pack(), grid()
Für den Taschenrechner ist place besser, um jeden Steuerelement genau zu positionieren
Die Schriftart kann auch direkt im Lable() mit Parameter hinzugefügt werden, z.B. font=("Arial,6")
textvariable spielt eine Art 'Überwachung'rolle, indem sie tkinter string bindet, kann der Inhalt des Panels auf einfache Weise mit set() geändert werden
Schaltfläche, Eingabefeld-Einstellungen
Schaltfläche, die Parameter der Eingabefelder und des Panels ähnlich sind
self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#EE6A50',text=self.ButtonList[0], font=self.ButtonFont,command=self.clear) self.NumButton.place(x=30,y=80,width=70,height=55) self.shiEntry=Entry(self.baoxianTk,validate='key',validatecommand=(self.checkNum,'%P'),font=self.EntryFont) self.shiEntry.place(x=190,y=80)
Ebenso wird die Grundgestaltung durch bg und ähnliche Parameter festgelegt, nur hier wird durch command Ereignisse gebunden, ähnlich wie in JQ mit .click
Hier wird place ebenfalls verwendet, um eine genaue Positionierung zu ermöglichen, wobei relief die Stil des Buttons darstellt
relief=FLAT oder GROOVE oder RAISED oder RIDGE oder SOLID oder SUNKEN
davon, den Inhalt des Eingabefeldes zu löschen
text.delete(10) # Löschen des Indexwerts10den Wert text.delete(10, 20) # Löschen der Indexwerte von10bis2Werte vor text.insert(0, END) # Löschen aller Werte
Eingabebeschränkung
Bei der Gestaltung von Funktionen können wir möglicherweise eine Eingabe durch den Benutzer in Form von Zahlen usw. benötigen, hier können wir einige Einschränkungen vornehmen
Der Button-Parameter validate spezifiziert, wann die mit validatecommand gebundene Funktion ausgeführt wird, %P kann den Inhalt der Eingabe in Echtzeit abrufen
Wenn die Option validate auf key gesetzt ist, wird jede Eingabeoperation abgefangen, in diesem Fall wird True zurückgegeben, um die Weißenergie in das Entry einzugeben
self.checkNum=self.baoxianTk.register(self.validateNum) self.gerenEntry=Entry(self.baoxianTk,validate='key',validatecommand=(self.checkNum,'%P'),font=self.EntryFont) self.gerenEntry.place(x=190,y=190) # Überprüfen, ob die Eingabe eine Zahl ist def validateNum(self,content): if content.isdigit() and int(content)>=0 or content=="": return True else: return False
Die Funktion validateNum() kann nach Bedarf geändert werden
Die Werte, die durch die Option validate optioniert werden können, sind:
Name | Ereignis |
---|---|
focus | Überprüfen Sie, wenn das Entry-Element den Fokus erhält oder verliert |
focusin | Überprüfen Sie, wenn das Entry-Element den Fokus erhält |
focusout | Überprüfen Sie, wenn das Entry-Element den Fokus verliert |
key | Überprüfen Sie, wenn das Eingabefeld bearbeitet wird |
all | Überprüfen Sie, wenn eine der folgenden Situationen auftritt |
Symbolgestaltung erweitert
In diesem kleinen Rechner habe ich % hinzugefügt/die Symbole sqrt
Für ihre Implementierung habe ich den Gedanken, vor dem Hinzufügen zum Panel zu überprüfen, welche Inhalte der Button übergeben werden
Wenn es sich um diese drei Symbole handelt, wird eine entsprechende Behandlung vorgenommen
Bei mehreren Stellen oder bei Ausdrücken mit Symbolen muss darauf geachtet werden
Man kann die Transformation nicht direkt durchführen, sondern muss die Anzahl der Stellen der zu transponierenden Zahl bestimmen, mein spezifischer Weg ist wie folgt
def checkList(self): result=0 locate=-1 listSum=0 for length in range(0,len(self.inputlist)): if re.findall(r'[-+*/]',str(self.inputlist[length])): result=1 if length>locate: locate=length else: pass if result==1: for i in range(locate+1,len(self.inputlist)): listSum+=int(self.inputlist[i])*(10**(len(self.inputlist)-i-1)) else: for j in range(0,len(self.inputlist)): listSum+=int(self.inputlist[j])*(10**(len(self.inputlist)-j-1)) return listSum,locate #hinzufügen von button def addButton(self,button): if button==self.ButtonList[18]: listSum,locate=self.checkList() if locate==-1: self.inputlist=[str(round(eval('1/'+str(listSum)),5))] else: for k in range(locate+1,len(self.inputlist)): del self.inputlist[k] self.inputlist.append(str(round(eval('1/'+str(listSum)),5)) elif button==self.ButtonList[19]: pass elif button==self.ButtonList[20]: pass else: self.inputlist.append(button) self.count.set(self.inputlist)
Über lambda
Baike Baidu: Ein Lambda-Ausdruck ist eine spezielle Form der Funktiondefinition in Python, die zum Definieren eines anonymen Funktionskörpers verwendet werden kann
Anders als andere Sprachen hat der Funktionskörper einer Lambda-Ausdrucksformel in Python nur ein einziges Statement, nämlich den Ausdrucksstatement für den Rückgabewert
Nachdem mehr Artikel gesucht wurden, wurde mehr verstanden, Lambda-Funktion kann als die "call back"-Funktion des Buttons betrachtet werden
Wenn wir Lambda nicht verwenden, um den Rückruf der Zwischenfunktion zu verzögern, wird die mit command gebundene Funktion beim Erstellen des Buttons aufgerufen
Der Unterschied zwischen den folgenden zwei Zeilen Code, das zweite führt die Funktion knobDown direkt beim Erstellen aus
self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[20], font=self.ButtonFont,command=lambda:self.knobDown(self.ButtonList[20])) self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[20], font=self.ButtonFont,command=self.knobDown(self.ButtonList[20]))
Eine detailliertere Erklärung kann in den letzten beiden Artikeln am Ende des Textes gefunden werden, die von Vorgängern gut geschrieben wurden
Über den Radiobutton
Es wurde versucht, das Beispiel in PPT zu implementieren-Erweiterung der Berechnung des Hypothekendarlehens, aber der BUG dieses Radio-Button wurde aufgegeben
Das folgende Beispiel wurde aus dem Internet zitiert, die genaue URL ist vergessen
durch variable die Bindung an ein IntVar() und durch .get() kann der Wert von Radiobutton.value abgerufen werden
#!/usr/bin/env python import tkinter from tkinter import * import tkinter.font as tkfont root=tkinter.Tk() val=tkinter.IntVar() val.set(0) def func1 if val.get() == 0: label.configure(text='radio 0') else: label.configure(text='radio 1 label = tkinter.Label(root, text='radio 0') label.pack() r0 = tkinter.Radiobutton(text = 'radio0', variable = val, value = 0) r0.pack() r1 tkinter.Radiobutton(text = 'radio1variable = val, value = 1) r1.pack() b = tkinter.Button(root, text='button', command=func1) b.pack() root.mainloop()
Packen
C:\Users\bayi\Desktop\shiyan\progrem (venv) λ pip install pyinstaller C:\Users\bayi\Desktop\shiyan\progrem (venv) λ pyinstaller -F -w -i favicon.ico run.py
Zunächst aufgrund der Einstellungen im Code, bei denen das ICO-Symbol im ersten Zeilen des nachfolgenden Codes eingestellt wurde
Es gibt ein Problem mit der Pfaderkennung beim Packen unter Windows, verschieben Sie das Symbol zu einem Ort mit einem kürzeren Pfad
Das Ändern in einen absoluten Pfad ist in Ordnung (im zweiten Zeilen des nachfolgenden Codes, exe und ico müssen im selben Verzeichnis sein)
self.baoxianTk.icobitmap('favicon.ico') self.baoxianTk.iconbitmap(os.getcwd())+'/favicon.ico')
Vorschau der Ergebnisse
Obwohl es sich um sofortiges Lernen und Verkaufen und um alte Kenntnisse anderer handelt, fühlt man sich nach dem Erfolg doch ziemlich erfolgreich (und ich bin anscheinend sehr anspruchsvoll in Bezug auf Design...)
Farben und Stile auswählen kann eine Weile dauern, einschließlich der Frontend des alten Spiders
Zusammenfassung
Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass der Inhalt dieses Artikels für Ihre Lern- oder Arbeitsaktivitäten einen gewissen Referenzwert hat. Wenn Sie Fragen haben, können Sie gerne Kommentare hinterlassen. Vielen Dank für Ihre Unterstützung der Anleitungshelden.
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetbenutzern selbstständig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte daran, hat ihn nicht von Hand bearbeitet und übernimmt keine rechtlichen Haftung. Wenn Sie auf Inhalte stoßen, die möglicherweise urheberrechtlich geschützt sind, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @ beim Senden einer E-Mail, um eine Beschwerde einzureichen, und fügen Sie relevante Beweise bei. Bei nachgewiesener Täuschung wird diese Website den fraglichen Inhalt sofort löschen.)