我將我的 tkinter 應用程式拆分為更多檔案,現在我有兩個檔案:
主程式
import tkinter as tk
from login_info import LoginInfo
class Main(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.login_page = LoginInfo(self)
self.login_page.pack(expand='True')
if __name__ == "__main__":
root = tk.Tk()
Main(root).pack(side="top", fill="both", expand=True)
root.mainloop()
登錄頁面.py
import tkinter as tk
class LoginInfo(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.login_frame = tk.Frame(self)
self.login_frame.pack()
self.username_label = tk.Label(self.login_frame, text='Username:')
self.username_label.grid(row=0, column=0, padx=(10,0), pady=(10,0))
self.username_entry = tk.Entry(self.login_frame)
self.username_entry.grid(row=0, column=1, padx=(10,0), pady=(10,0))
self.password_label = tk.Label(self.login_frame, text='Password:')
self.password_label.grid(row=1, column=0, padx=(10,0), pady=(10,0))
self.password_entry = tk.Entry(self.login_frame)
self.password_entry.grid(row=1, column=1, padx=(10,0), pady=(10,0))
self.login_button = tk.Button(self.login_frame, text='Login', command=self.login)
self.login_button.grid(row=2, column=0, columnspan=2, pady=20)
root.bind('<Return>', self.login)
def login(self,event):
print('Logged In')
if __name__ == "__main__":
root = tk.Tk()
LoginInfo(root).pack(side="top", fill="both", expand=True)
root.mainloop()
在登錄頁面中,我試圖將回傳按鈕系結到一個函式,但我遇到了這個錯誤:
NameError: name 'root' is not defined
只有當我從 main.py 啟動代碼時才會發生這種情況,如果我從 login_page.py 啟動它,它就會作業
uj5u.com熱心網友回復:
洗掉重復的...
if __name__ == "__main__":
root = tk.Tk()
LoginInfo(root).pack(side="top", fill="both", expand=True)
root.mainloop()
... 從login_page.py并從 啟動代碼main.py。
if __name__ == '__main__':...僅在啟動程式的模塊中使用一次。因為只有在這個模塊中,特殊變數__main__才會有值'__main__'。
另外,請確保您是從 匯入的login_page,而不是從login_info中匯入的main.py,因為您命名該模塊login_page.py而不是login_info.py.
具體代碼
通過這樣做,我能夠讓您的示例運行:
# main.py
import tkinter as tk
from login_page import LoginPage
class Main(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.login_page = LoginPage(self)
self.login_page.pack(expand='True')
if __name__ == "__main__":
root = tk.Tk()
main = Main(root)
main.pack(side="top", fill="both", expand=True)
root.mainloop()
# login_page.py
import tkinter as tk
class LoginPage(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.login_frame = tk.Frame(self)
self.login_frame.pack()
self.username_label = tk.Label(self.login_frame, text='Username:')
self.username_label.grid(row=0, column=0, padx=(10,0), pady=(10,0))
self.username_entry = tk.Entry(self.login_frame)
self.username_entry.grid(row=0, column=1, padx=(10,0), pady=(10,0))
self.password_label = tk.Label(self.login_frame, text='Password:')
self.password_label.grid(row=1, column=0, padx=(10,0), pady=(10,0))
self.password_entry = tk.Entry(self.login_frame)
self.password_entry.grid(row=1, column=1, padx=(10,0), pady=(10,0))
self.login_button = tk.Button(self.login_frame, text='Login', command=self.login)
self.login_button.grid(row=2, column=0, columnspan=2, pady=20)
self.bind_all('<Return>', self.login)
def login(self, event=None):
print('Logged In')
訣竅是在 的底部附近使用self.bind_all代替,它將密鑰系結到整個應用程式。這個函式似乎沒有記錄在官方 Python tkinter 檔案中,這可能表明有一個更 pythonic 的解決方案。root.bindlogin_page.py
我個人更愿意將此系結的宣告放在 main.py 中。我們這里有一個子單元,它默默地修改了一個父單元。專案越大,問題就越多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/536905.html
上一篇:pythontkinter主視窗
