[英]Tkinter entry box is always empty?
所以我正在嘗試編寫一個根據用戶輸入更新數據庫的程序。 該程序首先允許用戶使用他們的用戶名和密碼登錄,如果驗證成功,那么他們可以在四個選項之間進行選擇,put/post/get/delete。 我遇到的麻煩是我無法從輸入框中獲取用戶輸入。 (我在下面輸入了一小段代碼)
#The function that will call my api
def make_get_call(instructorid):
print(instructorid.get())
resp = requests.get(url)
#expecting to get a status of 200 on success
if resp.json()['status'] != 200:
print ('Something went wrong {}').format(resp.status_code)
exit()
#print data returned
print ("get succeeded")
for inspector in resp.json()['response']:
print (inspector["InspectorID"], str(inspector["InspectorName"]),inspector["Salary"])
#The window that pops up after the user clicks on "get user input" button
def getusers():
top.withdraw()
get.deiconify()
get.geometry('400x150')
get.title('Getting User Information')
Label(get, text = "Enter ID of specific inspector").pack(anchor=W)
id = StringVar()
Entry(get, textvariable = id).pack(anchor=W)
Button(get, text="Go", command = partial(make_get_call, id)).pack(anchor=W)
#THe window that pops up after user logs in successfully
def UserPage():
global top
if login:
tkWindow.withdraw()
top.deiconify()
top.geometry('400x150')
top.title('Valid Input')
commands = [("Get Information", getusers), ("Update Inspector", updateusers), ("Create User", createuser), ("Delete User", deleteuser)]
row = 0
for command, function in commands:
Button(top, text = command, command=function).grid(row = row, column = 5)
row+=4
# Function to validate if user inputed the right username
def validateLogin(username, password):
global login
print("Username Entered :", username.get())
print ("Password Entered: ", password.get())
data = {"username": username.get(), "password": password.get()}
#Sending to our API
resp = requests.get("http://localhost:3001/api/userlogin", json=data)
#If there is an error
if resp.json()['status'] != 200:
messagebox.showerror("Error", "Password/Username wrong. Please Try again")
exit()
else:
login = True
UserPage()
#THe GUI
tkWindow = Tk()
top = Tk()
top.withdraw()
get = Tk()
get.withdraw()
create = Tk()
create.withdraw()
update = Tk()
update.withdraw()
delete = Tk()
delete.withdraw()
login = False
tkWindow.geometry('400x150')
tkWindow.title('Login Form')
usernameLabel = Label(tkWindow, text = "User Name").grid(row= 0, column=3)
username = StringVar()
usernameEntry = Entry(tkWindow, textvariable = username).grid(row = 0, column=4)
passwordLabel = Label(tkWindow,text="Password").grid(row=1, column=3)
password = StringVar()
passwordEntry = Entry(tkWindow, textvariable=password, show='*').grid(row=1, column=4)
validateLogin = partial(validateLogin, username, password)
#login button
loginButton = Button(tkWindow, text="Login", command=validateLogin).grid(row=4, column=3)
tkWindow = Tk()
top = Tk()
top.withdraw()
get = Tk()
get.withdraw()
tkWindow.mainloop()
主要問題是當用戶嘗試在輸入框中輸入特定講師的 ID 時,當我將 id 變量傳遞給 function make_get_call(instructorid) 時,instructorid 始終為空。 起初我認為它與延遲有關,例如主循環部分,但我確保將.get() 放在一個方法中,以便它應該在主循環之后執行。 我也嘗試將 id 聲明為全局變量,但這也沒有用。 任何幫助將非常感激!
對不起,我真的剖析了你的代碼。
首先,我真的建議使用類而不是全局變量。 試試這個代碼,它應該是您應用程序的 rest 的良好啟動器。
from tkinter import *
class App(Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
self.grid(sticky = N+E+S+W)
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
self.createWidgets()
def createWidgets(self):
usernameLabel = Label(self.master, text = "User Name").grid(row= 0, column=3)
self.username = StringVar()
usernameEntry = Entry(self.master, textvariable = self.username).grid(row = 0, column=4)
passwordLabel = Label(self.master,text="Password").grid(row=1, column=3)
self.password = StringVar()
passwordEntry = Entry(self.master, textvariable=self.password, show='*').grid(row=1, column=4)
# validateLogin = partial(validateLogin, username, password)
# login button
loginButton = Button(self.master, text="Login", command=self.validateLogin).grid(row=4, column=3)
# Function to validate if user inputed the right username
def validateLogin(self):
global login
print("Username Entered :", self.username.get())
print ("Password Entered: ", self.password.get())
data = {"username": self.username.get(), "password": self.password.get()}
#THe GUI
root = Tk()
root.geometry('400x150')
root.title('Login Form')
tkWindow = App(root)
# login = False
tkWindow.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.