2015-05-14 2 views
2

Я строю gui в tkinter, и я вижу любопытное поведение для ttk.Combobox. Все инициализируется нормально, но когда я выбираю элемент из раскрывающегося списка, дисплей combobox очищается. Это происходит только в первый раз, когда я делаю выбор. Поэтому я запускаю приложение> сделать выбор>дисплей очищает> сделать другой выбор> diplays normal. Вот код (только краткие части для краткости). Класс combobox извлекает столбец из базы данных в виде списка и присваивает значение этим значениям. В противном случае это довольно сложно.Почему tkinter.ttk Combobox очищает отображаемое значение только при первоначальном выборе?

import tkinter as tk 
from tkinter import messagebox 
from tkinter import ttk 
from tkinter import N, S, E, W 
from tkinter import END, CENTER 

import dbmanager 


class MainGUI(tk.Tk): 

    """Main GUI class for EngCalc.""" 

    def __init__(self, db_mngr): 
     """See class docstring.""" 
     self.db = db_mngr 
     tk.Tk.__init__(self) 
     tk.Tk.wm_title(self, 'EngCalc') 
     self.init_root_frame(master=self) 

    def init_root_frame(self, master=None): 
     """Create and initialize main GUI container.""" 
     self.root_frame = ttk.Frame(master) 
     self.root_frame.grid() 

     DBCombo(master=self.root_frame, controller=self, 
       table='[Materials(SI)]', col='Material') 


class DBCombo(ttk.Combobox): 

    """A dropdown combobox for a given column in database table.""" 

    def __init__(self, master=None, controller=None, 
       table=None, col=None, row=0, column=0): 
     """See class docstring.""" 
     self.values = controller.db.fetch_list(table, col) 
     self.combovar = tk.StringVar() 
     ttk.Combobox.__init__(self, master, values=self.values, 
           textvariable=self.combovar) 
     self.current(0) 
     self.bind("<<ComboboxSelected>>", self.newselection) 
     self.grid(column=column, row=row) 
     self.state(['!disabled', 'readonly']) 

    def newselection(self, event): 
     """Get value of combobox.""" 
     self.combovar = self.get() 
     print(self.combovar) 


if __name__ == '__main__': 
    db = '../db/test1.sqlite' 
    database = dbmanager.DatabaseManager(db) 
    foo = MainGUI(database) 
    foo.mainloop() 

ответ

3

В какой-то момент в коде self.combovar указывает на экземпляр StringVar, но позже вы переопределять self.combovar быть строкой. Решением является не redefine self.combovar внутри newselection

+0

Thanks Bryan ... ошибка новобранец. Есть ли какое-либо преимущество в выполнении 'get()' на 'ComboBox' против его выполнения на' StringVar() '? –

+0

@ChristopherPearson: нет, нет никакого преимущества. –

Смежные вопросы