[英]Python GUI login using Tkinter
我正在創建一個界面,該界面首先提示用戶登錄數據庫。 我在使用Entry對象的get方法時遇到麻煩。 對於“登錄”按鈕命令,我使用lambda,因為我正在調用帶有參數的登錄函數。 由於我將Entry對象傳遞到登錄函數中,因此在這些函數中調用了user.get()和pw.get()。
但是,運行此代碼后,它說user.get(),pw.get()是沒有屬性get的Nonetype對象。 我不明白為什么條目是Nonetype,因為應該在創建按鈕之后調用logintoDB。
謝謝您的幫助。
下面是我的代碼:
import Tkinter as tk
import tkFileDialog as tkfd
import tkMessageBox as tkmb
import xlrd
def openFile():
#returns an opened file
fname = tkfd.Open(filetypes = [("xls files","*.xls")])
fpath = fname.show()
if fname:
try:
TLA_sheet = xlrd.open_workbook(fpath).\
sheet_by_name('TLA - TOP SKUs')
tk.Button(root, text = "Import TLAs", command = lambda: importTLAtoDB(TLA_sheet)).pack()
tkmb.showinfo("Success!", "Spreadsheet successfully loaded. \n\
Click Import TLAs to load TLA info into RCKHYVEDB database.")
except:
tkmb.showerror("Error", "Failed to read file\n '%s'\n\
Make sure file is a type .xls" % fpath)
def enter(event):
return logintoDB
def logintoDB(user, pw):
#request login for database access
print user.get(), pw.get()
try:
db = MySQLdb(config.server_link, user.get(), pw.get(), config.database)
tkmb.showinfo("Success!","Database login successful.\n\
Click Browse to load TLA spreadsheet.")
tk.Button(root, text = "Browse", command = openFile, width = 10).pack()
return True
except:
tkmb.showerror("Error", "Login failed. Try again.")
return False
#GUI setup
root = tk.Tk()
root.title("TLA Database Tool")
user_label = tk.Label(root, text = "username").pack()
user = tk.Entry(root, textvariable = tk.StringVar()).pack()
pw_label = tk.Label(root, text = "password").pack()
pw = tk.Entry(root, show = "*", textvariable = tk.StringVar()).pack()
login_button = tk.Button(root, text = "Login", command = lambda: logintoDB(user,pw)).pack()
root.mainloop()
以下行在您的代碼中是錯誤的:
user = tk.Entry(root, textvariable = tk.StringVar()).pack()
pw = tk.Entry(root, show = "*", textvariable = tk.StringVar()).pack()
顯然,上面的user
和pw
變量指向Entry
小部件對象,而不是與那些對象關聯的textvariable
。
相反,您應該使用textvariable
屬性設置一個新變量, textvariable
使用lambda運算符將其作為參數傳遞。
這是一個從“ Text
小部件中獲取文本的簡單示例。
from Tkinter import *
root = Tk()
svalue = StringVar() # defines the widget state as string
w = Entry(root,textvariable=svalue) # adds a textarea widget
w.pack()
def act():
print "you entered"
print '%s' % svalue.get()
foo = Button(root,text="Press Me", command=act)
foo.pack()
root.mainloop()
注意,我如何設置一個單獨的變量svalue
並將其傳遞給Entry
小部件的textvariable
屬性。
回復您的評論
實際上,現在我仔細查看您的小部件創建,您正在創建小部件並將其打包在同一行中,然后像這樣保留對其的引用:
usr = Entry().pack()
由於pack()
返回null
,因此您為usr
保留了null
值。
而是這樣做:
usr = Entry(root,textvariable=svalue) # create here
usr.pack() # now pack
現在, usr
將具有對Entry
小部件的引用。
實際上,只需將行更改為以下內容,即可使您的整個程序正常工作:
user = tk.Entry(root, textvariable = tk.StringVar())
user.pack()
pw_label = tk.Label(root, text = "password").pack()
pw = tk.Entry(root, show = "*", textvariable = tk.StringVar())
pw.pack()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.