【问题标题】:Why does tkinter.ttk Combobox clear displayed value on initial selection only?为什么 tkinter.ttk Combobox 仅在初始选择时清除显示的值?
【发布时间】:2015-05-14 05:11:54
【问题描述】:

我正在 tkinter 中构建一个 gui,我看到 ttk.Combobox 的奇怪行为。一切都初始化得很好,但是当我从下拉列表中选择一个项目时,组合框显示会清除。这只会在我第一次进行选择时发生。所以我启动应用程序 > 进行选择 > 显示清除 > 进行另一个选择 > 显示正常。这是代码(为简洁起见,仅相关部分)。组合框类从数据库中获取列作为列表并将其分配给值。否则,它是非常简单的 tkinter。

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()

【问题讨论】:

    标签: python python-3.x combobox tkinter ttk


    【解决方案1】:

    在您的代码中的某个时刻self.combovar 指向StringVar 的一个实例,但后来您将self.combovar 重新定义为一个字符串。解决方案是不在newselection内重新定义self.combovar

    【讨论】:

    • 谢谢 Bryan... 菜鸟的错误。在ComboBox 上执行get() 与在StringVar() 上执行它有什么优势吗?
    • @ChristopherPearson:不,没有优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2017-10-10
    相关资源
    最近更新 更多