【问题标题】:How can I dynamically create ttk widgets depending on the value entered in a ttk.entry box?如何根据 ttk.entry 框中输入的值动态创建 ttk 小部件?
【发布时间】:2016-08-26 17:56:27
【问题描述】:

我正在尝试制作一个 GUI,只要用户在 ttk.entry 字段中输入一个整数,就需要在其下方显示许多复选按钮。例如,如果他们在输入小部件中输入“5”,则输入字段下方需要出现 5 个复选按钮。

编辑:

我最终使用了什么:

self.number_of_stages = tk.IntVar()
self.check_box_dict={}
self.num_of_stages={}
self.stagetempvar={}
self.equipment_widgets={}


def centrifugal_compressor_widgets(self):
    self.equipment_widgets.clear()
    self.equipment_widgets["NumOfStagesLabelCentComp"]=tk.Label(self.parent, text="Number of Stages:", bg="white")
    self.equipment_widgets["NumOfStagesLabelCentComp"].place(relx=0.5, y=260, anchor="center")

    self.equipment_widgets["NumOfStagesEntryCentComp"]=ttk.Entry(self.parent, textvariable=self.number_of_stages)
    self.equipment_widgets["NumOfStagesEntryCentComp"].place(relx=0.5, y=290, anchor="center")

def OnTraceCentComp(self, varname, elementname, mode):
    for key in self.check_box_dict:
        self.check_box_dict[key].destroy()
    try:
        if self.number_of_stages.get() <=15 :
            i=1
            self.stagetempvar.clear()
            while i <= self.number_of_stages.get():
                self.stagetempvar[i]=tk.StringVar()
                self.stagetempvar[i].set("Closed")
                self.check_box_dict[i]=ttk.Checkbutton(self.parent, text=i, offvalue="Closed", onvalue="Open",variable=self.stagetempvar[i])
                self.check_box_dict[i].place(relx=(i*(1/(self.number_of_stages.get()+1))), y=360, anchor="center")
                i+=1
    except:
        pass

【问题讨论】:

  • 您正在努力解决问题的哪一部分?你知道如何在python中做循环吗?你知道如何通过按钮调用函数吗?
  • 我终于想通了。我在ttk 输入字段中引用的IntVar() 上使用了trace() 方法。 trace 回调方法然后销毁复选框对象的字典(如果有一些已经存在的话),然后进行一些条目验证,然后执行一个 while 循环。
  • 您应该要求它立即发生在您的问题中。它可能会为一些人节省一些时间。
  • 我说“一旦用户输入”,但我应该更具体。我认为这将是一个我忽略的简单解决方案。
  • 我认为问题在于它的措辞方式,看起来问题是“我如何在循环中创建小部件”,而真正的问题是“我如何调用一个函数作为每个输入字符”。

标签: python python-2.7 tkinter


【解决方案1】:

看看下面,让我知道你的想法......

一个非常丑陋,超级基础的例子:

from Tkinter import *

root = Tk()
root.geometry('200x200')
root.grid_rowconfigure(0, weight = 1)
root.grid_columnconfigure(0, weight = 1)

win1 = Frame(root, bg= 'blue')
win1.grid(row=0, column=0, sticky='news')


number = IntVar()
entry = Entry(win1, textvariable = number)
entry.pack()
confirm = Button(win1, text = 'Press to create widgets...', command = lambda:create_widgets(number.get()))
confirm.pack()

def create_widgets(number):
    for n in range(0,number):
        Checkbutton(win1, text = 'Checkbutton number : %s' % n).pack()

root.mainloop()

【讨论】:

  • 感谢您的回复。不幸的是,我需要在输入输入字段时动态创建它们,而无需按下按钮。我最终在 tk 条目变量上使用了 trace() 方法。
猜你喜欢
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 2021-06-21
  • 1970-01-01
相关资源
最近更新 更多