创建一个首先提示用户登录数据库的界面。我在使用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()
答案 0 :(得分:1)
您的代码中包含以下行:
user = tk.Entry(root, textvariable = tk.StringVar()).pack()
pw = tk.Entry(root, show = "*", textvariable = tk.StringVar()).pack()
显然,上面的变量user
和pw
指向Entry
窗口小部件对象,而不是与这些对象关联的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
并将其传递给textvariable
小部件的Entry
属性。
回复您的评论
事实上,现在我仔细查看您的小部件创建,您正在创建小部件并将其打包在同一行中,然后保持对它的引用,如:
usr = Entry().pack()
由于pack()
返回null
,因此null
的值为usr
。
而是这样做:
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()