python - PYTHON / TKINTER - 如何访问另一个类中的变量
问题描述
我知道这已经被问过很多次了,但我无法弄清楚如何将显示的示例应用到我自己的代码中。我只开发了 3 个月,我目前正在制作一个健康应用程序,只是为了好玩。
以下是我认为与该问题相关的以下代码。
这些是用户名和密码输入的标签/字段(位于 SignUp 类中)
#Username label/entry
self.login_username_label = tk.Label(self.signinframe, text="Username:", fg='black', bg='light cyan', font=xsml_font)
self.login_username_label.grid(row=1, column=0, padx=(10,0), pady=(25,0))
self.login_username_entry = tk.Entry(self.signinframe, width=15, textvariable=self.USERNAME_ENTRY)
self.login_username_entry.grid(row=1, column=1, padx=(0,0), pady=(25,0))
#Password label/entry
self.login_password_label = tk.Label(self.signinframe, text="Password:", fg='black', bg='light cyan', font=xsml_font)
self.login_password_label.grid(row=2, column=0, padx=(10,0), pady=(15,0))
self.login_password_entry = tk.Entry(self.signinframe, show="*", width=15, textvariable=self.PASSWORD_ENTRY)
self.login_password_entry.grid(row=2, column=1, padx=(0,0), pady=(15,0))
#Sign in button - COMMAND = self.sign_in
self.sign_in_btn = tk.Button(self.signinframe, text="Sign In", command=self.sign_in, fg='white', \
bg='light sea green')
self.sign_in_btn.grid(row=3, column=1, padx=(0,20), pady=(15,0), sticky=tk.E)
self.sign_in_btn.config(font=('Calibri', 14))
这是登录的功能,可以正常工作(位于 SignUp 类中)
def sign_in(self):
#Connect to db / create cursor
db = sqlite3.connect('user.db')
c = db.cursor()
c.execute('SELECT * from users WHERE username="%s" AND password="%s"' % (self.login_username_entry.get(), self.login_password_entry.get(),))
#If record found show login success label, then launch def launch
if c.fetchone() is not None:
#login failed label
self.login_succ_lbl = tk.Label(self.signinframe, text="Login Success.", fg='green',\
bg='light cyan', font=sml_font)
self.login_succ_lbl.place(relx=0.45, rely=0.7)
#after 1500 launch home window
self.main.after(1500, self.launch)
#else show login failed label and clear fields for user to retry
else:
#clear username/password fields
self.login_username_entry.delete(0, tk.END)
self.login_password_entry.delete(0, tk.END)
#login failed label
self.login_fail_lbl = tk.Label(self.signinframe, text="Login failed. ", fg='red',\
bg='light cyan', font=sml_font)
self.login_fail_lbl.place(relx=0.45, rely=0.7)
显示的所有代码都包含在此类中
#SIGN UP CLASS (THIS IS THE SIGN UP/LOGIN PAGE)
class SignUp:
def __init__(self, main):
self.main = main
#to use across classes as needed
self.USERNAME_ENTRY = tk.StringVar()
self.PASSWORD_ENTRY = tk.StringVar()
#Make sign up window non-resizable
self.main.resizable(width=False, height=False)
#call logo class
logo = Logo(main)
#MAIN FRAME FOR SIGNUP (OUTER FRAME THAT CONTAINS ALL INNER FRAMES)
self.mainframe = tk.LabelFrame(self.main, text='Welcome to Health Tracker', fg='black', \
bg='light cyan', labelanchor=tk.NW, width=660, height=560, borderwidth=2, highlightthickness=0, font=lge_font)
self.mainframe.grid(row=1, column=0, padx=(5,5), pady=5, ipadx=15, ipady=15, sticky=tk.E)
#Force frame size for sign up
self.mainframe.grid_propagate(False)
当用户登录时,它会将他们带到一个新页面,即此类
class Home:
def __init__(self, main):
self.main = main
self.main.geometry("900x880")
self.main.title("Welcome to Health Tracker")
self.main.config(bg='white')
#non resizable window
self.main.resizable(width=False, height=False)
我想在登录后使用 self.USERNAME_ENTRY 和 self.PASSWORD_ENTRY 变量向用户显示详细信息。但由于它们是 SignUp 类的一部分,因此在 Home 类中无法识别它们。我试图通过在 SignUp 类中为每个定义一个 tk.StringVar() 来调用它们,然后在 Home 类中调用它们,但这不起作用。这是我尝试过的。
#USER STATS (part of the Home class)
conn = sqlite3.connect("user.db")
c = conn.cursor()
c.execute('SELECT * from users WHERE username="%s" AND password="%s"' % (SignUp.USERNAME_ENTRY.get(), SignUp.PASSWORD_ENTRY.get(),))
record = c.fetchone()
如何将 self.USERNAME_ENTRY 和 self.PASSWORD_ENTRY 的值从 SignUp 类传递到 Home 类?
此外,如果相关,则使用 if name == main 命令调用 SignUp 类,如下所示
#RUN TKINTER MAINLOOP
def main():
root = tk.Tk()
#Declare the SignUp class to init program
app = SignUp(root)
#root config
root.geometry('700x690')
root.title("Sign Up To Health Tracker")
root.config(bg='white')
#LOGOFRAME for app logo
#Define logoframe size/position
logoframe = tk.LabelFrame(root, bg="white", width=480, height=90, borderwidth=0, highlightthickness=0)
logoframe.grid(row=0, column=0, columnspan=4, ipadx=25, sticky=tk.N)
#force width and height on frame
logoframe.grid_propagate(0)
#Define logo image and grid position
logo = tk.PhotoImage(file = "logo.png")
logo_label = tk.Label(logoframe, image=logo, borderwidth=0, highlightthickness=0)
logo_label.grid(row=0, column=0)
#run mainloop for program
tk.mainloop()
#run main if being run as standalone
if __name__ == '__main__':
main()
解决方案
推荐阅读
- java - 如何在不安装的情况下从一个应用程序启动另一个应用程序
- node.js - 我正在尝试以 json 的形式访问正文中收到的数据,但未定义
- c++ - 在 C++ 中,默认构造函数初始化的类中的元素是否也在考虑 new 关键字?
- eclipse - 如何使用 Gradle Kotlin DSL 创建 Eclipse 项目?
- elasticsearch - 在弹性搜索中,如何根据不影响实际查询命中的特定条件过滤特定的内部对象
- python - 在 Lambda 中读取 AWS S3 CSV 列名称
- c++ - 是否可以让 Bitset 将位打印到单行?
- ios - 以编程方式创建时未显示导航控制器
- ios - IOS 开发 - 从 safari 中的 webview 打开 url 链接,而不是当前的 webview
- php - PHP语言中的多循环