Binding Tkinter绑定和.get()问题

Binding Tkinter绑定和.get()问题,binding,tkinter,Binding,Tkinter,我正在尝试将ENTER键绑定到电子邮件密码输入框。这样,当我输入了所有三项后,我可以按enter键调用callback()函数。我遇到的另一个问题是.get()方法。它似乎没有将我在输入框中输入的值分配给我在代码中定义的变量 from Tkinter import * root = Tk() # grabs the values in the entry boxes and assigns them to variablse def callback(): steamUser = s

我正在尝试将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
从Tkinter导入*
root=Tk()
#获取输入框中的值并将其分配给variablse
def callback():
streamuser=streamuserw.get()
steamPass=steamPassW.get()
emailPass=emailPassW.get()
root.destroy()
#每个条目的标签
标签(root,text=“Steam Username”).grid(行=0)
标签(root,text=“Steam Password”).grid(行=1)
标签(root,text=“电子邮件密码”).grid(行=2)
#条目和按钮小部件
streamuserw=条目(根)
streampassw=条目(根,show=“*”)
emailPassW=条目(根,show=“*”)
提交=按钮(根,text=“提交”,命令=回调)
#将ENTER键绑定到回调函数
emailPassW.bind(“,回调)
#将小部件隔开
streamuserw.grid(行=0,列=1)
streampassw.grid(行=1,列=1)
emailPassW.grid(行=2,列=1)
submit.grid(行=3,列=1)
root.mainloop()
打印蒸汽用户
EDIT,我的新代码修复了.get()问题,但我的ENTER键仍然存在绑定问题

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
从Tkinter导入*
类gui:
定义初始(自我,主):
self.master=master
#每个条目的标签
标签(self.master,text=“Steam Username”).grid(行=0)
标签(self.master,text=“Steam Password”).grid(行=1)
标签(self.master,text=“电子邮件密码”).grid(行=2)
#按钮小部件
self.streamuserw=条目(self.master)
self.steamPassW=条目(self.master,show=“*”)
self.emailPassW=条目(self.master,show=“*”)
self.submit=按钮(self.master,text=“submit”,command=self.assign)
#将ENTER键绑定到回调函数
self.emailPassW.bind(“,self.assign)
self.emailPassW.bind(“,self.assign)
#将小部件隔开
self.streamuserw.grid(行=0,列=1)
self.steamPassW.grid(行=1,列=1)
self.emailPassW.grid(行=2,列=1)
self.submit.grid(行=3,列=1)
#获取输入框中的值并将其分配给variablse
def分配(自我):
self.streamuser=self.streamuserw.get()
self.steamPass=self.steamPassW.get()
self.emailPass=self.emailPassW.get()
self.close()
#关闭GUI窗口
def关闭(自我):
self.master.destroy()
root=Tk()
userGui=gui(根)
root.mainloop()
打印userGui.streamuser
赋值有效,但仅适用于callback()作用域的一组局部变量 这意味着,在函数终止后,您不会“看到”这些变量

绑定ENTER键和NumPad ENTER键,否则仅完成一半 因此,最初提出的代码很难处理同一函数中的每个不同事件上下文


更好地组织不同的事件/处理程序,您的事件处理将根据每个上下文变得更简单。

在用户3666197的帮助下,我能够找出其中的一些问题,通过谷歌搜索,我找到了一个解决方案

我必须创建一个gui类,以便轻松存储和访问三个用户输入

至于绑定,我得到的错误是
callback()
(我重命名为
assign()
)接受的参数太多。错误正好是
TypeError:assign()接受的参数正好是1个(给定2个)
。因此我通过允许将尽可能多的参数传递到assign()函数
def assign>中来解决这个问题(self,*args):
。实际上,我不太清楚为什么在按enter键后出现此错误,如果有人知道,请告诉我

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
从Tkinter导入*
类gui:
定义初始(自我,主):
self.master=master
#每个条目的标签
标签(self.master,text=“Steam Username”).grid(行=0)
标签(self.master,text=“Steam Password”).grid(行=1)
标签(self.master,text=“电子邮件密码”).grid(行=2)
#按钮小部件
self.streamuserw=条目(self.master)
self.steamPassW=条目(self.master,show=“*”)
self.emailPassW=条目(self.master,show=“*”)
self.submit=按钮(self.master,text=“submit”,command=self.assign)
#将ENTER键绑定到回调函数
self.emailPassW.bind(“,self.assign)
self.emailPassW.bind(“,self.assign)
#将小部件隔开
self.streamuserw.grid(行=0,列=1)
self.steamPassW.grid(行=1,列=1)
self.emailPassW.grid(行=2,列=1)
self.submit.grid(行=3,列=1)
#获取输入框中的值并将其分配给variablse
def分配(自身,*参数):
self.streamuser=self.streamuserw.get()
self.steamPass=self.steamPassW.get()
self.emailPass=self.emailPassW.get()
self.close()
#关闭GUI窗口
def关闭(自我):
self.master.destroy()
root=Tk()
userGui=gui(根)
root.mainloop()
打印userGui.streamuser
打印userGui.emailPass

赋值不起作用的原始错误是因为您正在将值赋值给局部变量。它起作用,但回调之外的任何函数都看不到它们。解决方法是将变量声明为全局变量,或者重新构建代码以使用类,并使类具有变量属性

绑定的问题是回调需要接受一个参数。当您使用
bind
时,调用的函数将始终传递一个参数。此参数是表示事件的对象。从该对象可以获得触发事件的小部件、光标的x/y坐标以及其他几个b它是信息的载体

对于原始代码,您可以按如下方式修复它:
    # <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
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
def callback(event):
    global steamUser, steamPass, emailPass
    steamUser = steamUserW.get()
    steamPass = steamPassW.get()
    emailPass = emailPassW.get()
    root.destroy()
def callback(self, event):
    ...