首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tkinter ttk组合框默认值

Tkinter ttk组合框默认值
EN

Stack Overflow用户
提问于 2015-08-13 06:00:35
回答 1查看 5K关注 0票数 0

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

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

代码语言:javascript
复制
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()

代码语言:javascript
复制
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)

我试图找到一种更优雅的方法来实现这一点,并且我找到了一些相关的到这里来,但是实现该方法并不顺利,我认为从按钮命令调用add_equation()可能与此有关。

*我在上使用Python3.4。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-13 08:54:48

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

我会把它改写成这样:

代码语言:javascript
复制
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保持活力,直到窗口关闭为止,因此所有的内容都会得到正确的刷新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31980520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档