2015-05-14 114 views
2

我在tkinter中構建一個gui,我看到一個ttk.Combobox的好奇行爲。一切都初始化好,但是當我從下拉列表中選擇一個項目時,組合框顯示清除。這隻會在我第一次做出選擇時發生。因此,我啓動應用>進行選擇>顯示清除>進行其他選擇>顯示正常。這裏是代碼(爲了簡潔起見,只有相關的部分)。組合框類從數據庫中提取列作爲列表並將其分配給值。否則,它是非常直接的tkinter。爲什麼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是一個字符串。解決的辦法是不是重新定義self.combovar裏面newselection

+0

謝謝布萊恩......菜鳥的錯誤。在'ComboBox'上執行'get()'與在'StringVar()'上執行''有什麼優勢? –

+0

@ChristopherPearson:不,沒有優勢。 –