【问题标题】:Tkinter ttk Combobox Default ValueTkinter ttk 组合框默认值
【发布时间】:2015-11-05 23:11:00
【问题描述】:

我正在构建一个 Tkinter 应用程序,但遇到了将默认值设置为组合框的问题。我设法解决了这个问题,但我很想知道它为什么会起作用,我想知道是否有更好的方法来解决这个问题。

我有一个 tk.Toplevel() 窗口弹出一个组合框,使用 fowling 代码:

class add_equation():

    def __init__(self):

        self.add_window = tk.Toplevel()
        self.add_window.title("Add Equation Set")
        self.add_window.resizable(width=False, height=False)

        self.name_entry_var = tk.StringVar()
        self.name_entry = ttk.Entry(self.add_window, textvariable=self.name_entry_var, width=30)
        self.name_entry.grid(row=1, columnspan=2, stick="w")

        self.equation_type_var = tk.StringVar()
        self.equation_type = ttk.Combobox(self.add_window, textvariable=self.equation_type_var, values=("System", "Exact", "Import Point List..."), state="readonly", width=28, postcommand =lambda: self.add_window.update())
        self.equation_type.current(0)
        self.equation_type.grid(row=2, columnspan=2, sticky="w")

        self.add_window.update()

add_quation() 类在以下代码中被调用:

import tkinter as tk
from tkinter import ttk

class Solver_App(tk.Tk, ttk.Frame):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        list_frame = ttk.Frame(self, height=50)
        list_frame.pack(side="top", fill="y", expand=True, anchor="w")

        # Button that will call the class add_equation that creates a new window.
        add_button = ttk.Button(list_frame, text="Add Equation Set", command=add_equation)
        add_button.pack(side="top", expand=False, fill="x", padx=10, pady=5, anchor="n")

app = Solver_App()
app.mainloop()

回顾add_equation() 类,如果您删除self.equation_type.current(0)postcommand =lambda: self.add_window.update(),默认值将不再显示,但两者都可以正常工作。为什么它会这样工作而不是只有self.equation_type.current(0)

我试图找到一种更优雅的方法,我找到了一些相关的over here,但我没有运气实现该方法,我假设从按钮命令调用add_equation() 可能有事可做用那个。

*我在 Mac OS X Yosemite 上使用 Python 3.4。

【问题讨论】:

    标签: python combobox tkinter ttk


    【解决方案1】:

    我认为这可能是因为您正在通过调用 add_equation 构造函数来创建一个窗口,并且该窗口会立即被垃圾收集(或者至少是它的 python 句柄),因此永远不会正确刷新。

    我会把它改写成这样:

    class Equation_Window(tk.Toplevel):
    
        def __init__(self):
    
            tk.Toplevel.__init__(self)
    
            self.title("Add Equation Set")
            self.resizable(width=False, height=False)
    
            self.name_entry_var = tk.StringVar()
            self.name_entry = ttk.Entry(self, textvariable=self.name_entry_var, width=30)
            self.name_entry.grid(row=1, columnspan=2, stick="w")
    
            self.equation_type_var = tk.StringVar()
            self.equation_type = ttk.Combobox(self, textvariable=self.equation_type_var, values=("System", "Exact", "Import Point List..."), state="readonly", width=28)
            self.equation_type.current(0)
            self.equation_type.grid(row=2, columnspan=2, sticky="w")
    
    def add_equation():
        w = Equation_Window()
        w.wait_window()
    

    (其他一切都保持不变)

    我已将您的 add_equation 类更改为从 tk.Toplevel 派生的东西(并重命名),我认为这更有意义。然后我将add_equation 设为一个函数,并调用wait_window(其作用类似于mainloop,但仅针对一个窗口)。 wait_window 将保持 w 处于活动状态,直到窗口关闭,所以一切都会正确刷新。

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 2012-07-25
      • 2012-04-07
      • 2014-02-14
      相关资源
      最近更新 更多