привязать выпадающий список к функции

#python-2.7 #tkinter

#python-2.7 #tkinter

Вопрос:

У меня есть меню опций, и я привязал его к функции, но я не могу поместить в него полосу прокрутки, поэтому вместо этого я использовал ComboBox. Но теперь привязка не работает

       Cat_options = ['Select Category']
      self.var = StringVar(self.ViewWM)
      conn = sqlite3.connect(self.DatabaseName)
      conn.text_factory = str
      cursor = conn.cursor()
      cursor.execute("SELECT Category FROM Websites_info WHERE LoginName LIKE ?" ,(self.LoginName,))
      conn.commit()
      a =''
      for row in cursor.fetchall():
          if a == row:
              pass
          else:
              row = str(row)
              row = row.replace("('","")
              row = row.replace("',)","")              
              Cat_options.append(row)
              a = row
      self.var.set(Cat_options[0]) # initial value
      Cat_ComboBox = ttk.Combobox(self.ViewWM, textvariable = self.var ,   values = Cat_options)
      Cat_ComboBox.place(x=10,y =45 , width = 183)
      Cat_ComboBox.bind('<<ComboBoxSelected>>', self.Cat_callback)
      b1 = Button(self.ViewWM,text="aaaa",command=self.Cat_callback)
      b1.place(x = 200,y=200)


  self.ViewWM.mainloop()
def Cat_callback(self, event=None):
    self.Selcted_Cat = self.var.get()
    print  self.Selcted_Cat
    print 'hello'
 

Моя кнопка a работает нормально, но не привязывается

Комментарии:

1. Что значит «не работает»? Вы получаете сообщение об ошибке? Добавьте полное сообщение, о котором идет речь.

2. Я искал, так как я спросил и нашел это

3. Cat_ComboBox.bind(‘<<ComboboxSelected>>’, лямбда-событие: self. Cat_callback())

4. @furas 20 спасибо

5. Cat_ComboBox.bind('<<ComboboxSelected>>', self.Cat_callback) работает для меня, потому что вы используете event=None in Cat_callback . Но в старом коде, который у вас был <<ComboBoxSelected>> с B вместо b в word box , так что это была ваша проблема.

Ответ №1:

Проблема B в верхнем <<ComboBoxSelected>> . Это должно быть <<ComboboxSelected>>


Полный рабочий пример

 from __future__ import print_function

try:
    # Python 2
    import Tkinter as tk
    import ttk
except ImportError:
    # Python 3
    import tkinter as tk
    from tkinter import ttk

# -------

class App(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        self.var = tk.StringVar()

        options = ["Alpha", "Beta", "etc.", "Omega"]

        cb = ttk.Combobox(self, textvariable=self.var, values=options)
        cb.pack()
        cb.bind('<<ComboboxSelected>>', self.callback)

        b1 = ttk.Button(self, text="OK", command=self.callback)
        b1.pack()

    def callback(self, event=None):
        print('--- callback ---')
        print('var.get():', self.var.get())
        if event:
            print('event.widget.get():', event.widget.get())

# -------

App().mainloop()
 

Комментарии:

1. Спасибо, в следующий раз я буду использовать ваш пример, но для моей программы я сделал кнопку, поэтому я сохраню evevnt = None

Ответ №2:

с помощью

      Cat_ComboBox.bind('<<ComboboxSelected>>',
                      lambda event: self.Cat_callback())
 

теперь все работает

       Cat_options = ['Select Category']
      self.var = StringVar(self.ViewWM)
      conn = sqlite3.connect(self.DatabaseName)
      conn.text_factory = str
      cursor = conn.cursor()
      cursor.execute("SELECT Category FROM Websites_info WHERE LoginName LIKE ?" ,(self.LoginName,))
      conn.commit()
      a =''
      for row in cursor.fetchall():
          if a == row:
              pass
          else:
              row = str(row)
              row = row.replace("('","")
              row = row.replace("',)","")              
              Cat_options.append(row)
              a = row
      self.var.set(Cat_options[0]) # initial value
      Cat_ComboBox = ttk.Combobox(self.ViewWM, textvariable = self.var ,   values = Cat_options)
      Cat_ComboBox.place(x=10,y =45 , width = 183)
      Cat_ComboBox.bind('<<ComboboxSelected>>',
                      lambda event: self.Cat_callback())   #changing in code
      b1 = Button(self.ViewWM,text="aaaa",command=self.Cat_callback)
      b1.place(x = 200,y=200)


  self.ViewWM.mainloop()
def Cat_callback(self, event=None):
    self.Selcted_Cat = self.var.get()
    print  self.Selcted_Cat
    print 'hello'