使用Tkinter进行Python GUI登录

时间:2014-06-27 17:57:01

标签: python user-interface 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()

1 个答案:

答案 0 :(得分:1)

您的代码中包含以下行:

user = tk.Entry(root, textvariable = tk.StringVar()).pack()
pw = tk.Entry(root, show = "*", textvariable = tk.StringVar()).pack()

显然,上面的变量userpw指向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()
相关问题