如何从组合框事件中调用方法

时间:2014-07-22 05:21:19

标签: python-2.7 tkinter

我正在尝试从组合框中调用一个方法选择更改事件 使用lambda表达式但我遇到了以下错误

TypeError :()不带参数(给定1个)

我认为我按照方法定义传递了1个参数,有人可以在我错的地方帮助我

或任何其他组合框选择的更改事件代码将是很有帮助的!

请注意我的代码

self.boxWidget[boxName].bind("<<ComboboxSelected>>", lambda:invoke_Setting_Group(self))

def invoke_My_method1(self):    
    print "expand another window"

我正在尝试将第一个类对象传递给第二个python脚本文件,以便为变量值分配easeness。我试图使用这个没有lambda的combox事件更改代码然后我注意到这个方法被自动调用所以我用lambda来防止这种自动方法调用

抱歉,我不了解lambda表达式的使用方法;这里我只用来防止自动方法执行。没有lambda表达式,我注意到我的组合框函数自动启动,我不明白为什么会这样?

我正在使用TKinter python 2.6

更详细的上述代码:

#Main_GUI_Class.py
##----------------------
import sys

class App():  

    def __init__ (self,master,geometry=None,root=None):    
        try:
           self.master=master                  
           if not root:
              self.root=Tkinter.Toplevel(master) 

    def initUI(self):
        try:                      
            self.master.title("GUI")        
            menubar = Menu(self.master)
            self.root.config(menu=menubar)    
            fileMenu.add_command(label='Open')                     
            submenu_ncss.add_command(label='Model Setting',command=lambda:Combo_Expand_Script.Call_Model_Setting(self))   

##----------------------

def main():
    r = Tkinter.Tk()    
    r.withdraw()
    r.title("GUI Sample")
    r.wm_iconbitmap(Pic1)
    v = App(r)
    r.mainloop()    

if __name__ == "__main__":
    main()

##Combo_Expand_Script.py
##-----------------------

import sys
import Tkinter

import Main_GUI_Class

def Call_Model_Setting(self):
    try:    
        self.PopUpWin = Toplevel(bg='#54596d',height=500, width=365)
        self.PopUpWin.title("POP UP SETTING")

        #Combo Boxs in Pop Up                      
        boxNameGroup="boxSetting"                  
        boxPlaceY=0    
        for Y in range(4):                      
          boxName=boxNameGroup+str(Y)
          if Y == 0:
              boxPlaceY=50
          else:
              boxPlaceY=boxPlaceY+40
          self.box_value = StringVar()

          self.boxWidget[boxName] = ttk.Combobox(self.PopUpWin, height=1, width=20)             

          if Y== 0:
               self.boxWidget[boxName]['values'] = ('A', 'B')
               self.boxWidget[boxName].current(1)
          if Y== 1:
               self.boxWidget[boxName]['values'] = ('X', 'Y')               
               self.boxWidget[boxName].bind("<<ComboboxSelected>>",lambda:invoke_Setting_Group(self))
          self.boxWidget[boxName].place(x=180, y = boxPlaceY)

       #Buttons in Pop Up
        self.btnApply = tk.Button(self.PopUpWin,width=10, height=1,text="Apply",relief=FLAT,bg=btn_Bg_Color,command=lambda: treeDataTransfer(self,0))
        self.btnApply.pack()          
        self.btnApply.place(x=75, y = 460)                  
        self.btnCancel = tk.Button(self.PopUpWin,width=10, height=1,text="Cancel",relief=FLAT,command=lambda: deleteTreeNodes(self))
        self.btnCancel.pack()          
        self.btnCancel.place(x=170, y = 460)
    except IOError:
       print "Error: data error"

def invoke_Setting_Group(self):#, event=None
    try:    
        #self.boxName.current(0)
        self.boxWidget["boxSetting3"].current(0)
        self.PopUpWin['width']=1050
        self.PopUpWin['height']=700
        self.btnApply.place(x=500, y = 550)
        self.btnCancel.place(x=600, y = 550)        

        self.txtWidget={}  

        lsttxtSetting = ['1', '2','3 ','4','5 ','6','7','8','9','10']                         
        for t in range(10):                  
              txtName=txtNameGroupTS+str(t)
              if t == 0:
                  txtPlaceY=120
              else:
                  txtPlaceY=txtPlaceY+30

              self.txtWidget[txtName] = Text(self.groupSettingFrame,height=1, width=10,borderwidth = 2)
              self.txtWidget[txtName].insert(INSERT, lsttxtSetting[t])
              self.txtWidget[txtName].pack()                      
              self.txtWidget[txtName].place(x=200, y = txtPlaceY)

    except IOError:
       print "Error: Group Settings Popup error"      

def turbDataTransferBind(self):

    for P in range(0,3):
        boxName="boxSetting"+str(X)
        dataSettingbox=self.lstTurb[X]+" "+self.boxWidget[boxName].get()
        self.root_node_Setting = self.tree.insert( self.root_node_ChildSetting["ChildSettingNode"], 'end', text=dataSettingbox, open=True) 

def treeDataTransfer(self,dlgTurbFlag):    
    self.treeDataTransferBind()
    print "data tranfer sucess"
def deleteTreeNodes(self):
    print "delete nodes"

1 个答案:

答案 0 :(得分:2)

command=bind期望函数名称 - 没有()和参数 - 所以代替

如果您使用

.bind("<<ComboboxSelected>>", invoke_Setting_Group(self) )

然后您使用invoke_Setting_Group(self)的结果作为.bind()中的第二个参数。这样,您就可以动态生成在bind

中用作参数的函数
TypeError: () takes no arguments (1 given)

这意味着您有函数function()但python将其作为function(arg1)

运行

您运行lambda:invoke_Setting_Group(self)但python期望lambda arg1:self.invoke_Setting_Group(self)

您可以使用额外参数创建函数

def invoke_My_method1(self, event):    
    print "expand another window"
    print "event:", event, event.widget, event.x, event.y

然后你可以使用它

.bind("<<ComboboxSelected>>", lambda event:invoke_Setting_Group(self, event))

BTW:它看起来很奇怪 - 你有类App()但是在第二个文件中你只使用函数而不是某些类。