Tkinter绑定和.get()问题

时间:2014-08-30 05:25:16

标签: 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 = 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

3 个答案:

答案 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)

分配有效,但仅适用于callback()范围

本地的一组变量

这意味着,你没有&#34;看到&#34;函数终止后的这些变量。

绑定每个 ENTER NumPad-ENTER 键,否则只完成一半

# 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

而是使用智能上下文处理

包装到Class和process中

您的代码在两个不同的上下文中调用您的def callback():构造

  1. 作为Button( ... , command = callback )
  2. 作为条目小部件.bind( ..., callback )
  3. 如上所述,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