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

Usar Tkinter (python3.6) Implementar una calculadora simple

Prólogo

Comenzó el curso de práctica en el ordenador, bueno, después de que el profesor llegó, leyó un poco de PPT, y dijo: comencemos......

Luego, comencé mi viaje en Python GUI, nunca había tocado la interfaz gráfica de Python (aunque no es muy inteligente)

Pero ahora, sentirse bastante conveniente al escribir herramientas pequeñas, la primera biblioteca que encontré fue Tkinter, así que comencé a escribir

Más tarde, descubrí que QT es bastante bueno, así que en el próximo experimento usaré QT. Luego, sobre Tkinter (python3.6)

Código fuente del calculadora ennn.....Los nombres no son estándar...

Primero, la implementación de la pila en Python se realiza mediante la simulación de una lista

pop() desempila, append() empila

Primero veamos los componentes pequeños principales proporcionados por TKinter:

Clase de componente pequeño Descripción
Button Botón
Canvas Gráficos estructurados, utilizados para dibujar gráficos, crear editores de gráficos y realizar clases de componentes pequeños personalizados
Checkbutton Hacer clic en el botón de casilla de verificación para alternar entre valores
Entry Área de texto o caja de texto
Frame Contenedor (puede contener otros componentes pequeños)
Etiqueta Muestra texto o imágenes
Menu Barra de menú que muestra el menú desplegable y el menú emergente
Menubutton Botón del menú de la lista desplegable
Mensaje Al igual que el texto etiquetado, pero puede colocar automáticamente el texto dentro de un ancho y altura dados
Radiobutton Botón de opción
Texto Visualización de texto formateado, admite imágenes y texto incrustados, permite mostrar y editar texto con diferentes estilos y propiedades

Iniciar una ventana

Para hacer algo visual, lo primero que se piensa con seguridad es la ventana

La ventana tiene muchos componentes, como title, ico, size, bd, menú, etc.

import tkinter
import os
from tkinter import *
class Calculator(object):
 """Calculadora"""
 def __init__(self):
 self.tk=tkinter.Tk() # Instanciar
 self.tk.title('Calculadora')
 self.tk.minsize(370,460)
 self.tk.maxsize(400,400)
 # También se puede usar self.tk.resizable(0, 0) para prohibir la modificación del tamaño
 self.tk.iconbitmap(os.getcwd())+'/favicon.ico')
 def start(self):
 self.tk.mainloop() 
if __name__ == '__main__':
 NewCalculator=Calculator()
 NewCalculator.start()

Aquí se ha generado una ventana básica, para la función de mainloop() dentro de la misma

Si lo eliminamos, la ventana se desvanecerá rápidamente, y su propósito es evitar这种情况

Visualización de la pantalla

Después de hacer un calculador, debe ser primero el resultado del cálculo, aquí se necesita generar la pantalla de visualización

Claro, también nos vendrá naturalmente a la mente la configuración de fuentes para el contenido de visualización, ejemplos específicos se muestran en el código siguiente

....
import tkinter.font as tkfont
....
 # 设置字体
 self.EntryFont=tkfont.Font(self.tk, size=)13)
 self.ButtonFont=tkfont.Font(self.tk, size=)12)
 #mostrar en el panel
 self.count=tkinter.StringVar()
 self.count.set('0')
 self.label=tkinter.Label(self.tk,bg='#EEE9E9',borde='3',color_fondo='negro',ubicacion_contenido='centro',fuente=self.EntryFont,textvariable=self.count)
 self.label.place(y=10,ancho=380,height=40)
....

donde algunos parámetros del panel Lable en tkinter, los que se utilizan aquí básicamente pueden satisfacer las necesidades comunes

donde bg es el color de fondo, fg es el color de primer plano, cambia el color del contenido, anchor es la ubicación del contenido en el panel, como se muestra en la siguiente imagen

dirección ejemplo tabla
nw n ne
w centro e
sw s se

En cuanto al posicionamiento del panel y el botón posterior, se pueden usar muchos métodos, place puede ubicar con precisión, también se puede usar pack(), grid()

para el calculador, place es mejor, puede ubicar cada control con precisión

donde la fuente también se puede agregar directamente como parámetro en Lable(), por ejemplo, font=("Arial,6")

textvariable actúa como 'escuchar', se vincula con tkinter string, y se puede cambiar el contenido del panel de manera conveniente mediante el método set()

botón, configuración de cuadro de entrada

botón, los parámetros de cuadro de entrada y el panel dentro son similares

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 mismo es configurar el estilo básico a través de parámetros como bg, solo que aquí se utiliza el enlace de eventos command, similar a .click en JQ

Aquí también se utiliza place para poder ubicar de manera precisa, donde relief representa el estilo del botón

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

donde se elimina el contenido del cuadro de entrada

text.delete(10) #Eliminar el valor de índice10valor
text.delete(10, 20) #Eliminar el valor de índice desde10hasta2valores antes de 0
text.insert(0, END) #Eliminar todos los valores

Límite de entrada

Al diseñar características, es posible que necesitemos que el usuario ingrese números, aquí se puede limitar

El parámetro Button specifies cuándo ejecutar la función enlazada a validatecommand, se puede usar %P para obtener el contenido de entrada en tiempo real

Cuando la opción validate se especifica como key, cualquier acción de entrada será interceptada, en este momento se debe retornar True para que la energía blanca se ingrese al 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)
#Verificar si se ingresa un número 
def validateNum(self,content):
 if content.isdigit() and int(content)>=0 or content=="":
 return True
 else:
 return False

La función validateNum() se puede modificar según las necesidades

Los valores que se pueden configurar en la opción de validación validate son:

nombre evento
focus Verificar cuando el componente Entry gane o pierda el enfoque
focusin Verificar cuando el componente Entry gane el enfoque
focusout Verificar cuando el componente Entry pierda el enfoque
key Verificar cuando el cuadro de entrada sea editado
all Verificar cuando se presente cualquier una de las siguientes situaciones

Diseño de símbolos de expansión

En esta calculadora agregué el porcentaje (%)/símbolos sqrt,

Mi enfoque para su implementación es verificar el contenido del botón antes de agregarlo al panel

Si son estos tres símbolos, realice el tratamiento correspondiente

En los que se debe prestar atención si es un número de varios dígitos o una expresión con signo

No se puede realizar la transformación directamente, se necesita determinar el número de dígitos del número que desea transponer, mi método específico es el siguiente

 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
 #Añadir 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)

Sobre lambda

Baidu Encyclopedia: La expresión Lambda es un tipo especial de definición de función en Python, que se puede usar para definir una función anónima

Diferente de otros lenguajes, el cuerpo de la expresión Lambda de Python solo puede tener una única instrucción, es decir, la expresión de valor de retorno

Después de buscar más artículos, se entiende más, la función Lambda puede decirse que tiene el efecto de 'callback' en el botón

Si no usamos Lambda para retrasar el callback de la función intermedia, la función a la que está vinculada command se llamará al crear el botón

La diferencia entre las dos siguientes líneas de código es que la segunda ejecuta directamente la función knobDown al crear

self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[22
self.NumButton=tkinter.Button(master=self.tk,relief=GROOVE,bg='#BFEFFF',text=self.ButtonList[22

Una explicación más detallada se puede encontrar en los dos artículos al final, los antepasados escriben bien

Acerca del cuadro de selección

Quería implementar el ejemplo dado en el PPT-La expansión del cálculo de préstamos hipotecarios, pero renuncié a este cuadro de selección radio debido a un BUG

El siguiente ejemplo se copió de la red, pero olvidé el enlace específico

es así que se bind un IntVar() a través de variable, y a través de .get() se puede obtener el valor de 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 = 'radio1variable = val, value = 1)
r1.pack()
b = tkinter.Button(root, text='button', command=func1)
b.pack()
root.mainloop()


Empaquetar

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

Al principio, debido a la configuración del código de la línea uno de abajo, el icono ico se configuró como

Hay un problema con la identificación de la ruta de paquete en Windows, cambie el icono a un lugar con una ruta más corta

Modifique la ruta absoluta y estará bien (el segundo código del siguiente código, exe y ico deben estar en el mismo directorio)

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

Vista previa del efecto

Aunque aprendí y vendí al mismo tiempo y para el viejo conocimiento de los demás, después de que tuve éxito, sentí una sensación de logro (y parece que soy muy exigente con el diseño gráfico...)

Elige colores y estilos durante mucho tiempo, incluyendo el frontend del antiguo escarabajo

Resumen

Este es el contenido completo de este artículo. Espero que el contenido de este artículo tenga cierta valoración de referencia para su aprendizaje o trabajo. Si tienen alguna pregunta, pueden dejar comentarios para intercambiar. Gracias por su apoyo a Tutorial de Gritos.

Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar, y proporcione evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará