我正在尝试将ENTER键绑定到电子邮件密码输入框。这样,当我输入所有三个项目时,我可以按Enter键来调用callback()
功能。我遇到的另一个问题是使用.get()
方法。它似乎没有将我在输入框中输入的值分配给我在代码中定义的变量。
from Tkinter import *
root = Tk()
# grabs the values in the entry boxes and assigns them to variablse
def callback():
steamUser = steamUserW.get()
steamPass = steamPassW.get()
emailPass = emailPassW.get()
root.destroy()
# labels for each entry
Label(root, text="Steam Username").grid(row=0)
Label(root, text="Steam Password").grid(row=1)
Label(root, text="Email Password").grid(row=2)
# entry and button widgets
steamUserW = Entry(root)
steamPassW = Entry(root, show="*")
emailPassW = Entry(root, show="*")
submit = Button(root, text="Submit", command=callback)
# bind the ENTER key to callback function
emailPassW.bind("<Return>", callback)
# space out the widgets
steamUserW.grid(row=0, column=1)
steamPassW.grid(row=1, column=1)
emailPassW.grid(row=2, column=1)
submit.grid(row=3, column=1)
root.mainloop()
print steamUser
编辑,我的新代码修复了.get()问题,但我仍然遇到输入键的绑定问题
from Tkinter import *
class gui:
def __init__(self, master):
self.master = master
# labels for each entry
Label(self.master, text="Steam Username").grid(row=0)
Label(self.master, text="Steam Password").grid(row=1)
Label(self.master, text="Email Password").grid(row=2)
# button widget
self.steamUserW = Entry(self.master)
self.steamPassW = Entry(self.master, show="*")
self.emailPassW = Entry(self.master, show="*")
self.submit = Button(self.master, text="Submit", command=self.assign)
# bind the ENTER key to callback function
self.emailPassW.bind("<Return>", self.assign)
self.emailPassW.bind("<KP_Enter>", self.assign)
# space out the widgets
self.steamUserW.grid(row=0, column=1)
self.steamPassW.grid(row=1, column=1)
self.emailPassW.grid(row=2, column=1)
self.submit.grid(row=3, column=1)
# grabs the values in the entry boxes and assigns them to variablse
def assign(self):
self.steamUser = self.steamUserW.get()
self.steamPass = self.steamPassW.get()
self.emailPass = self.emailPassW.get()
self.close()
# closes GUI window
def close(self):
self.master.destroy()
root = Tk()
userGui = gui(root)
root.mainloop()
print userGui.steamUser
答案 0 :(得分:1)
分配不起作用的原始错误是因为您将值分配给局部变量。它工作正常,但回调之外的任何功能都无法看到它们。修复方法是将变量声明为全局变量,或者重新设计代码以使用类,并使变量成为类的属性。
绑定的问题是你的回调需要接受一个参数。使用bind
时,调用的函数将始终传递参数。该参数是表示事件的对象。通过此对象,您可以获得触发事件的窗口小部件,光标的x / y坐标以及其他一些信息。
对于原始代码,您可以像这样修复:
def callback(event):
global steamUser, steamPass, emailPass
steamUser = steamUserW.get()
steamPass = steamPassW.get()
emailPass = emailPassW.get()
root.destroy()
由于您已切换到使用某个类,因此您必须为该事件设置一个参数,并为self
设置一个参数:
def callback(self, event):
...
这种传递参数的行为已有详细记录。例如,Events and Bindings上的effbot页面显示:
&#34;如果小部件中出现与事件描述匹配的事件, 使用描述事件的对象调用给定的处理程序。&#34;
答案 1 :(得分:0)
这意味着,你没有&#34;看到&#34;函数终止后的这些变量。
# COMMAND prepared as <lambda>-container
# to show both auto-injected
# and ad-hoc added variable <placeholder>-s
a_COMMAND2bind = ( lambda aTkInjectedBindEVENT = None, # .SET a <placeholder>
aParameter1 = None, # .SET a <placeholder>
aParameter2 = None, # .SET a <placeholder>
anotherPlaceholderVoidVAR = "?": # .SET another if needed
callback( aTkInjectedBindEVENT ) # .ACT on <<Event>>
or # trick to chain
print( "DEBUG:: aParameter1 == ", aParameter1 )
or
print( "DEBUG:: aParameter2 == ", aParameter2 )
or
call_other_Funct( "Log: " # .ACT on <<Event>>
+ time.ctime()
)
)
# --.|||||||||
root.event_add( "<<anEnterKeyVirtualEVENT>>", "<KeyPress-Return>", # setup as-<<aVirtualEVENT>>
"<KeyPress-KP_Enter>"
)
# --.||||
root.bind( "<<anEnterKey_VirtualEVENT>>", a_COMMAND2bind ) # .bind aCommandAsLAMBDA
您的代码在两个不同的上下文中调用您的def callback():
构造
Button( ... , command = callback )
.bind( ..., callback )
如上所述,Tkinter在事件发生时自动注入anEventOBJECT,以允许上下文完整处理:
# <anEventOBJECT>.char on-{ <KeyPress> | <KeyRelease> }
# .height on-{ <Configure> }
# .width on-{ <Configure> }
# .keysym on-{ <KeyPress> | <KeyRelease> }
# .keysym_num on-{ <KeyPress> | <KeyRelease> }
# .num on-{ <Mouse-1> | <Mouse-2> | ... } 4,5 == <MouseWheel> <--test on target platform O/S
# .serial <-- system-assigned Integer
# .time <-- system-assigned Integer ( .inc each msec )
# .widget <-- system-assigned <widget>-instance
# .x <-- system-assigned <Event>-in-<widget>-mouse-location.x
# .y <-- system-assigned <Event>-in-<widget>-mouse-location.y
# .x_root <-- system-assigned <Event>-on-<Screen>-mouse-location.x
# .y_root <-- system-assigned <Event>-on-<Screen>-mouse-location.y
因此,最初提出的代码将很难处理同一函数中的每个不同事件上下文。
更好地构建不同的事件/处理程序,每个上下文的事件处理都会变得更简单。
答案 2 :(得分:0)
在user3666197的帮助下,我能够解决一些问题,通过一些谷歌搜索,我想出了一个解决方案。
我必须创建一个gui类,这样我就可以轻松存储和访问三个用户输入。
至于绑定,我得到的错误是callback()
(我重命名为assign()
的参数太多了。错误正是TypeError: assign() takes exactly 1 argument (2 given)
。所以我修复了通过允许将多个参数传递给assign()函数def assign(self, *args):
。我实际上不太确定为什么在按下回车后出现此错误,如果有人知道请告诉我!
from Tkinter import *
class gui:
def __init__(self, master):
self.master = master
# labels for each entry
Label(self.master, text="Steam Username").grid(row=0)
Label(self.master, text="Steam Password").grid(row=1)
Label(self.master, text="Email Password").grid(row=2)
# button widget
self.steamUserW = Entry(self.master)
self.steamPassW = Entry(self.master, show="*")
self.emailPassW = Entry(self.master, show="*")
self.submit = Button(self.master, text="Submit", command=self.assign)
# bind the ENTER key to callback function
self.emailPassW.bind("<Return>", self.assign)
self.emailPassW.bind("<KP_Enter>", self.assign)
# space out the widgets
self.steamUserW.grid(row=0, column=1)
self.steamPassW.grid(row=1, column=1)
self.emailPassW.grid(row=2, column=1)
self.submit.grid(row=3, column=1)
# grabs the values in the entry boxes and assigns them to variablse
def assign(self, *args):
self.steamUser = self.steamUserW.get()
self.steamPass = self.steamPassW.get()
self.emailPass = self.emailPassW.get()
self.close()
# closes GUI window
def close(self):
self.master.destroy()
root = Tk()
userGui = gui(root)
root.mainloop()
print userGui.steamUser
print userGui.emailPass