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