Перехватить событие при редактировании выпадающего списка - PullRequest
4 голосов
/ 08 декабря 2011

Я использую ComboBox как часть большого графического интерфейса, написанного на python / tkinter.

При изменении раскрывающегося списка цвет обновляется, чтобы указать пользователю, что что-то изменилось.

Однако комбинированный список также позволяет пользователю вводить собственное значение. Я также хочу, чтобы цвет менялся, когда это происходит.

Проблема в том, что я ничего не вижу в документации ComboBox , указывающей, как это сделать.

Ответы [ 3 ]

9 голосов
/ 08 декабря 2011

Вы можете использовать StringVar в качестве параметра конструктора Combobox. Этот StringVar можно отследить ( т.е. , подписаться на каждое изменение).

Вот небольшой пример:

from Tkinter import *
from ttk import *

def on_field_change(index, value, op):
    print "combobox updated to ", c.get()

root = Tk()
v = StringVar()
v.trace('w',on_field_change)
c = Combobox(root, textvar=v, values=["foo", "bar", "baz"])
c.pack()

mainloop()
3 голосов
/ 08 декабря 2011

Я заметил, что где-то в Tkinter документах Python упоминается, что ComboBox является подклассом Entry.

С Entry вот что вы делаете. Установите конфигурацию:

  • -validatecommand должен быть установлен на то, что вы хотите, чтобы происходило при нажатии клавиши (в моем случае, измените цвет).
  • -validate следует установить на key, что означает, что команда проверки будет вызываться при каждом нажатии клавиши, когда курсор находится в записи.

Вот страница tk для ввода текста для дальнейшего использования.

То же самое для комбинированных списков работает точно так же (насколько я могу судить).

2 голосов
/ 05 января 2019

Просто привяжите <> к методу ...

import tkinter as tk
from tkinter import ttk

class Main(tk.Tk):

  def __init__(self, *args, **kwargs):
    tk.Tk.__init__(self, *args, **kwargs)
    self.container = tk.Frame(self)
    self.container.pack(side="top", fill = "both", expand=True)
    self.container.grid_rowconfigure(0, weight=1)
    self.container.grid_columnconfigure(0, weight=1)
    self.cb=ttk.Combobox(self.container, values=[0,1, 2, 3] , state='readonly')
    self.cb.bind('<<ComboboxSelected>>', self.modified)    
    self.cb.pack()

  def modified (self, event) :
      print(self.cb.get())

main = Main()
main.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...