python - Tkinter 与 OOP python
问题描述
我的目标是获得一个非常基本的 GUI,其中包含两个选项卡,其中第一个选项卡具有登录、注册新用户和取消注册该用户的选项。如果我想单击第二个选项(注册用户或称为“darse de alta”),它应该会出现第二个窗口(并关闭第一个窗口),我可以在其中输入我的信息进行注册(姓名、dni 和电话号码) . 那么这个程序的最后一点应该是将这个新用户添加到名为 self.socios 的数据库中。这是因为在类 Registro_socios 中的方法“agregar”中,每当我想注册一个新用户时,他都必须添加到数据库中。我不知道如何将新用户与之前创建的类联系起来。感谢任何可以以某种方式解释和澄清的人。
class Socio:
def __init__(self,nombre_socio,dni,telefono):
self.nombre = nombre_socio
self.dni = dni
self.telefono = telefono
def __str__(self):
return "Nombre: {0}\nDNI: {1}\nTelefono: {2}".format(self.nombre,self.dni,self.telefono)
class Registro_socios:
def __init__(self,baseDatos_socios = None):
if baseDatos_socios is None:
baseDatos_socios = {} # Diccionario vacío con DNIs como Keys
self.socios = baseDatos_socios
def agregar(self,socio):
if self.existe(socio): # En el caso que existe retorne True
raise KeyError(f'{socio.__class__.__name__} ya existente') # A Python KeyError exception is what is raised when you try to access a key that isn't in a dictionary ( dict )
self.socios[socio.dni] = socio
def existe(self,socio):
if socio.dni in self.socios:
return True
return False
root = tk.Tk()
miFrame = Frame(root)
# miFrame = Frame(root,width=1000,height=500)
miFrame.pack()
def alta_socio():
otra_ventana = tk.Toplevel(root)
miFrame2 = Frame(otra_ventana)
miFrame2.pack()
texto_nombreUsuario = Entry(miFrame2).grid(row=0,column=1, padx=5, pady=5)
nombre_usuario = Label(miFrame2, text='Nombre de socio: ').grid(row=0,column=0, padx=5, pady=5)
texto_DNI = Entry(miFrame2).grid(row=1,column=1, padx=5, pady=5)
nombre_usuario = Label(miFrame2, text='DNI: ').grid(row=1,column=0, padx=5, pady=5)
texto_nombreUsuario = Entry(miFrame2).grid(row=2,column=1, padx=5, pady=5)
nombre_usuario = Label(miFrame2, text='Teléfono de contacto: ').grid(row=2,column=0, padx=5, pady=5)
root.iconify()
botonInicio = Button(root, text='Entrar',bg='orange')
botonInicio.pack()
boton_AltaSocio = Button(root, text='Darse de alta',bg='orange', command=alta_socio)
boton_AltaSocio.pack()
boton_BajaSocio = Button(root, text='Darse de baja',bg='orange', command=baja_socio)
boton_BajaSocio.pack()
root.mainloop()
解决方案
我在这里看到很多错误。第一个是你调用主窗口tk.Tk()
和框架为Frame
,所以我想你像这样导入 tkinter 两次:
import tkinter as tk
from tkinter import *
忘记第二次导入并将其放在tk
每个小部件之前。
然后 Button 'dar-se baja' 调用一个未定义的方法。
在alta_socio
您正在执行此操作的方法中:
texto_nombreUsuario = tk.Entry(miFrame2).grid(row=0,column=1, padx=5, pady=5)
这很糟糕,因为当tk.Entry()
返回类 Entry 的实例时,该Entry.grid()
方法不返回任何内容。如此,您texto_nombeUsuario
将None
无法访问条目小部件中的内容。你应该这样做:
texto_nombreUsuario = tk.Entry(miFrame2)
texto_nombreUsuario.grid(row=0,column=1, padx=5, pady=5)
另一种选择是使用 StringVar:
texto_nombreUsuario = tk.StringVar(root)
tk.Entry(miFrame2, textvariable=texto_nombreUsuario).grid(row=0,column=1, padx=5, pady=5)
对于您在电话中使用的第三个条目,alta_socio()
您使用的名称与您使用的相同变量相同。修理它。最后,您可以添加一个tk.Button
将调用将创建一个Socio
. 喜欢:
tk.Button(miFrame2, text='Confirmar', command=add_socio).grid()
该方法add_socio()
可以是嵌套方法,这样alta_socio()
它就可以访问变量texto_nombreUsuario
和。它使用命令获取文本并调用先前创建的类:texto_DNI
texto_telefono
texto_nombreUsuario
texto_nombreUsuario.get()
def alta_socio():
def add_socio(): # this function is nested so it can access variables defined in alta_socio
nombre = texto_nombreUsuario.get()
tel = texto_telefono.get()
dni = texto_dni.get()
socio = Socio(nombre, dni, telefono) # here you call the Socio class previously defined
otra_ventana = tk.Toplevel(root)
miFrame2 = tk.Frame(otra_ventana)
miFrame2.pack()
texto_nombreUsuario = tk.StringVar(root) # this is a tkinter variable which contains the user name
# this entry saves it values in the tkinter variable above:
tk.Entry(miFrame2, textvariable=texto_nombreUsuario).grid(row=0,column=1, padx=5, pady=5)
tk.Label(miFrame2, text='Nombre de socio: ').grid(row=0,column=0, padx=5, pady=5)
...
推荐阅读
- javascript - API 在未发送 /api/users/create 响应的情况下解析,这可能会导致请求停止。下一个
- python-3.x - 如何在具有多个参数的熊猫数据帧上调用函数
- flutter - 小部件是在应该使用之前创建的 => 导致错误
- mysql - 使用光标按几何距离分页
- c# - 获得无效的差异:类型参数必须是通用接口的不变有效错误
- javascript - JavaScript 中的任一类型实现
- python - 如何为 lineEdit 更改 QValidator 的行为:
- python-3.x - Selenium:单击下拉菜单中的菜单不起作用
- swift - 如何裁剪由 AVCaptureMovieFileOutput 录制的视频?
- google-analytics - 谷歌分析:创建一个排除访问特定 URL 的所有用户的视图?