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