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

Implementazione di un calcolatore semplice utilizzando Tkinter (python3.6)

Prefazione

L'attivazione del corso di pratica è iniziata, um, dopo che il professore è arrivato, ha letto il PPT e ha detto: Inizia a fare.........

Poi ho iniziato il mio viaggio in Python GUI, non avevo mai avuto a che fare con l'interfaccia grafica di Python (anche se è abbastanza saggio farlo)

Ma sembra piuttosto semplice scrivere strumenti, alla ricerca ho trovato la prima libreria Tkinter e ho iniziato a scrivere.

Successivamente, ho scoperto che Qt è piuttosto buono, quindi utilizzerò Qt per il prossimo esperimento. E poi riguardo a Tkinter (python3.6)

Codice sorgente del calcolatore ennn.....ci sono molti nomi non standardizzati.....

La realizzazione di pila in Python viene solitamente simulata tramite lista.

pop() per espellere, append() per aggiungere.

Prima di tutto, diamo un'occhiata ai classi di componenti principali fornite da Tkinter:

Classe di componente piccolo Descrizione
Button Pulsante
Canvas Grafica strutturata, utilizzata per disegnare grafici, creare editor di grafica e implementare classi di componenti personalizzati.
Checkbutton Clicca sul pulsante di spunta per alternare tra i valori.
Entry Area di testo o campo di testo
Frame Contenitore (può contenere altri componenti più piccoli)
Etichetta Visualizzazione di testo o immagini
Menu Barra del menu che visualizza il menu a discesa e il menu a comparsa.
Menubutton Pulsante del menu a discesa
Messaggio Simile a un etichetta che visualizza il testo, ma può automaticamente posizionare il testo all'interno di un'area specificata di larghezza e altezza.
Radiobutton Pulsante di scelta singola
Testo Visualizzazione del testo formattato, supporto per immagini e testi incorporati, possibilità di visualizzare e modificare il testo con stili e attributi diversi.

Inizia una finestra.

Quando si pensa a qualcosa di visivo, la finestra è probabilmente la prima cosa che viene in mente.

La finestra ha molte componenti, come title, ico, size, bd, menu e altri.

import tkinter
import os
from tkinter import *
class Calculator(object):
 """Calcolatrice"""
 def __init__(self):
 self.tk=tkinter.Tk() #istanza
 self.tk.title('Calcolatrice')
 self.tk.minsize(370,460)
 self.tk.maxsize(400,400)
 #puoi anche usare self.tk.resizable(0, 0) per disabilitare la regolazione delle dimensioni
 self.tk.iconbitmap(os.getcwd()+'/favicon.ico')
 def start(self):
 self.tk.mainloop() 
if __name__ == '__main__':
 NewCalculator=Calculator()
 NewCalculator.start()

Ecco una finestra di base generata, per il ruolo di mainloop() nel suo interno

Se lo eliminiamo, la finestra scompare istantaneamente, serve per prevenire questo tipo di situazione

#visualizzazione del pannello

Dopo averlo configurato come calcolatrice, sicuramente la prima cosa che deve essere visualizzata è il risultato del calcolo, per cui è necessario generare il pannello di visualizzazione

Naturalmente, penseremo anche alla configurazione dei caratteri per la visualizzazione del contenuto, esempi specifici sono nel codice seguente

....
import tkinter.font as tkfont
....
 #impostazione dei caratteri
 self.EntryFont=tkfont.Font(self.tk,size=13)
 self.ButtonFont=tkfont.Font(self.tk,size=12)
 #visualizzazione del pannello
 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)
....

Nella libreria tkinter il pannello Lable ha alcuni parametri, quelli utilizzati qui sono in grado di soddisfare le esigenze comuni

dove bg è il colore di sfondo, fg è il colore di primo piano, cambiare il colore del contenuto, anchor è la posizione di posizionamento del contenuto nella finestra, come nell'immagine seguente

direzione esempio tabella
nw n ne
w centro e
sw s se

Per la posizione del pannello e dei Button successivi, ci sono molti modi, place può posizionare con precisione, può anche essere utilizzato pack(), grid()

Per il calcolatore place è migliore, può posizionare con precisione ogni controllo

La tipografia può anche essere aggiunta direttamente come parametro a Lable(), ad esempio font=("Arial,6")

textvariable ha la funzione di "ascoltare", lega tkinter string, può essere cambiato convenientemente con set() per modificare il contenuto della scheda

Configurazione del pulsante, input box

Pulsante, i parametri dell'input box e della scheda interna sono simili

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)

Lo stesso attraverso la configurazione dei parametri come bg, viene impostato lo stile di base, ma qui viene utilizzato il binding del command per eventi, simile a .click in JQ

Qui il place è utilizzato per posizionare con precisione, il relief rappresenta lo stile del Button

relief=FLAT or GROOVE or RAISED or RIDGE or SOLID or SUNKEN

Tra cui l'eliminazione del contenuto dell'input box

text.delete(10) # Elimina il valore all'indice 10
text.delete(10, 20) # Elimina i valori dall'indice 10 al 20
text.insert(0, END) # Elimina tutti i valori

Limiti di input

Quando progettiamo funzionalità, potremmo aver bisogno di input numerici dagli utenti, qui possiamo impostare alcuni limiti

Il parametro Button di validate specifica quando eseguire la funzione associata a validatecommand, utilizzando %P è possibile ottenere il contenuto dell'input in tempo reale

Quando l'opzione validate è specificata come key, qualsiasi operazione di input viene intercettata e in questo momento True viene immesso l'energia bianca nell'Entry

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)
#Verifica se il contenuto è un numero 
def validateNum(self,content):
 if content.isdigit() and int(content)>=0 or content=="":
 return True
 else:
 return False

La funzione validateNum() può essere modificata secondo necessità

Con l'opzione di validazione validate è possibile impostare i seguenti valori:

nome evento
focus Verifica quando il componente Entry ottiene o perde il fuoco
focusin Verifica quando il componente Entry ottiene il fuoco
focusout Verifica quando il componente Entry perde il fuoco
key Verifica quando viene modificato il campo di input
all Verifica quando si verifica una di queste situazioni

Progettazione di simboli estesi

In questa calcolatrice ho aggiunto i simboli %, /, sqrt

Il mio approccio per la loro implementazione è di controllare il contenuto del button prima di aggiungerlo al pannello

Se si tratta di uno di questi tre simboli, si deve effettuare il trattamento corrispondente

Occorre prestare attenzione se si tratta di un numero a più cifre o di un'equazione con simboli

Non è possibile effettuare la trasformazione direttamente, è necessario determinare il numero di cifre del numero che desideri trasporre, il mio metodo specifico è il seguente

 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
 #Aggiungi 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)

Riguardo lambda

Wikipedia: L'espressione Lambda è un tipo speciale di definizione di funzione in Python, che può essere utilizzata per definire una funzione anonima

A differenza di altri linguaggi, l'espressione Lambda nelle espressioni Lambda di Python può avere solo una singola istruzione, ovvero l'espressione di valore di ritorno

Dopo aver cercato più articoli e capito di più, la funzione Lambda può essere detta avere un ruolo di 'callback' per i pulsanti

Se non utilizziamo Lambda per ritardare il callback della funzione intermedia, la funzione associata a command viene chiamata contemporaneamente alla creazione del pulsante

La differenza tra le seguenti due linee di codice è che la seconda esegue direttamente la funzione knobDown al momento della creazione

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

Per una spiegazione più dettagliata, si può fare riferimento agli ultimi due articoli alla fine del testo, gli anziani scrivono molto bene

Riguardo alla casella di selezione

Volevo implementare l'estensione dell'esempio fornito nel PPT - il calcolo del mutuo, ma ho abbandonato a causa di un BUG nella casella di selezione

Il seguente esempio è stato copiato da Internet, il sito specifico è stato dimenticato

attraverso la variabile binding un IntVar(), tramite il metodo .get() è possibile ottenere il valore di value del Radiobutton

#!/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 = 'radio1', variable = val, value = 1)
r1.pack()
b = tkinter.Button(root, text='button', command=func1)
b.pack()
root.mainloop()


Packaging

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

All'inizio perché il codice ha impostato l'icona ico come nella prima riga del codice sottostante

C'è un problema di riconoscimento del percorso di packaging sotto Windows, spostare l'icona in un percorso breve

Modificare in percorso assoluto è sufficiente (seconda riga del codice sottostante, exe e ico devono essere nella stessa directory)

self.baoxianTk.icobitmap('favicon.ico')
self.baoxianTk.iconbitmap(os.getcwd()+'/favicon.ico')

Anteprima dell'effetto

Anche se è stato appreso e venduto all'istante e ha appreso vecchie conoscenze altrui, ma dopo il successo è molto soddisfatto (e sembra che io sia piuttosto esigente con i requisiti di graphic design....

Prendere a挑选颜色和样式能挑半天,包括以前的那个爬虫的前端

Sommario

Questo è tutto il contenuto dell'articolo, spero che il contenuto di questo articolo abbia un valore di riferimento per il tuo studio o lavoro. Se hai domande, puoi lasciare un messaggio per discuterle, grazie per il supporto al tutorial di urla.

Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, il copyright è dell'autore originale, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato elaborato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una email a notice#oldtoolbag.com (al momento dell'invio dell'email, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare