English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Verwendung von Tkinter (python3.6) Ein einfacher Rechner implementieren

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.)

Gefällt mir