簡體   English   中英

Tkinter:如何通過登錄按鈕啟用菜單欄狀態

[英]Tkinter: How to enable menubar state by login button

我正在努力在tkinter中向我的APP添加菜單欄。 基本上,我希望禁用菜單欄,直到用戶登錄。現在,我有SampleApp類,LoginPage,我將MenuBar創建為一個單獨的類,並創建了其他幾個頁面。 我希望菜單欄在所有頁面中都相同。 我做了幾次嘗試,最后還是通過控制器並調用MenuBar內創建的方法使該工作正常進行,該方法將級聯“ One”狀態更改為正常。 請原諒,如果我缺少明顯的東西,我是新手。 如果有任何幫助,我將不勝感激。 感謝您的時間。

這是回溯:

    Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\DEV\Python\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
  File "D:/DEV/19_03_2018/SampleAPP.py", line 147, in login_btn_clicked
    self.controller.enable_menu()
  File "C:\DEV\Python\lib\tkinter\__init__.py", line 2095, in __getattr__
    return getattr(self.tk, attr)
AttributeError: '_tkinter.tkapp' object has no attribute 'enable_menu'

這是我的代碼片段:

 class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) menubar = MenuBar(self) self.config(menu=menubar) tk.Tk.wm_title(self, "SampleAPP") tk.Tk.iconbitmap(self, default="image/sample.ico") container = tk.Frame(self) container.grid(sticky="nsew") container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) self.frames = {} for F in (LoginPage, PatternCPage, PatternManagerPage, MenuPage): frame = F(container, self) self.frames[F] = frame frame.grid(row=0, column=0, sticky="nsew") self.show_frame(LoginPage) def show_frame(self, cont): frame = self.frames[cont] frame.tkraise() class MenuBar(tk.Menu): def __init__(self, parent): tk.Menu.__init__(self, parent) self.create_menu = tk.Menu(tearoff=0) self.manager_menu = tk.Menu(tearoff=0) self.add_cascade(label="One", menu=self.create_menu, state="disabled") self.add_cascade(label="Two", menu=self.manager_menu, state="disabled") self.create_menu.add_command(label="1") self.create_menu.add_command(label="2") self.create_menu.add_command(label="3") self.manager_menu.add_command(label="1") self.manager_menu.add_command(label="2") self.manager_menu.add_command(label="3") def enable_menu(self): self.entryconfig("One", state="normal") class LoginPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller self.label_username = tk.Label(self, text="Username:: ") self.label_password = tk.Label(self, text="Password: ") self.entry_username = tk.Entry(self) self.entry_password = tk.Entry(self, show="*") self.label_username.grid(row=1, column=4, sticky="e") self.label_password.grid(row=2, column=4, sticky="e") self.entry_username.grid(row=1, column=5, ) self.entry_password.grid(row=2, column=5, ) self.entry_username.bind('<Return>', self.login_btn_clicked) self.entry_password.bind('<Return>', self.login_btn_clicked) self.logbtn = ttk.Button(self, text="Login", command=self.login_btn_clicked) self.logbtn.grid(columnspan=10) self.logbtn.bind('<Return>', self.login_btn_clicked) def database(self): self.connection = mysql.connector.connect(user='sample', password='sample', host='samplehost', database='sampledb') self.cursor = self.connection.cursor() def login_btn_clicked(self, event=None): self.database() # print("Clicked") username = self.entry_username.get() password = self.entry_password.get() # print(username, password) if username == "" or password == "": tm.showerror("Error", "Empty fields") else: self.query = ("SELECT * FROM user_db WHERE username=%s AND password=%s") self.cursor.execute(self.query, (username, password)) self.result = self.cursor.fetchall() self.cursor.close() if len(self.result) > 0: tm.showinfo("Access granted", "Logged in!") self.controller.show_frame(MenuPage) self.controller.enable_menu() self.entry_password.delete(0, "end") else: tm.showerror("Access denied", "Invalid login data") app = SampleApp() app.mainloop() 

您已經在enable_menu MenuBar上將enable_menu為方法,但是您試圖將其作為SampleApp的方法來調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM