簡體   English   中英

使用Tkinter登錄Python GUI

[英]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()

顯然,上面的userpw變量指向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.

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