【问题标题】:Retrieving Data from Tkinter Window从 Tkinter 窗口检索数据
【发布时间】:2021-04-16 02:51:10
【问题描述】:

我创建了这个 tkinter 窗口并创建了这些下拉框。

        while number != (max+1):
            Subject1_Label = Label(master, text=("Subject", number))
            Subject1_Label.grid(row=number, column=0, pady=6)
            Subject1 = All_Subjects.get(number)
            variable = StringVar(master)
            variable.set(Subject1[0])
            w = OptionMenu(master, variable, *Subject1)
            w.grid(row=number, column=1, pady=6)
            subject_amount = subject_amount + 1
            number = number + 1

通常我可以简单地使用 (variable.get) 来确定下拉框中的输入,但在这种情况下,变量被使用 5 次以创建 5 个不同的框。有没有办法可以使用它们在 tkinter 窗口上的位置从这些下拉框中收集输入。比如(variable.get, row=1, column=1)?还是其他方式?

【问题讨论】:

  • 您可以将变量存储在列表中。
  • 不太确定在这种情况下我将如何做到这一点,我将如何实际检索“数学立场”、“英语标准”、“化学”、“木材”和“儿童研究”,因为它们是使用相同的变量创建。

标签: python tkinter pycharm


【解决方案1】:

您可以使用listdictionary 来存储变量。下面是一个使用dictionary的例子:

variables = {}
while number != (max+1):
    subject = f"Subject {number}"
    Subject1_Label = Label(master, text=subject)
    Subject1_Label.grid(row=number, column=0, pady=6)
    Subject1 = All_Subjects.get(number)
    variable = StringVar(master)
    variable.set(Subject1[0])
    variables[subject] = variable  # save the variable
    w = OptionMenu(master, variable, *Subject1)
    w.grid(row=number, column=1, pady=6)
    subject_amount = subject_amount + 1
    number = number + 1

然后你可以使用variables["Subject 1"].get()之类的东西来获取“主题1”的选定项。


更新一个例子:

from tkinter import *

# just for providing "All_Subjects.get(number)" in the while loop
class All_Subjects:
    subjects = ("math stand", "english standard", "chem", "timber", "child studies")
    def get(n):
        return All_Subjects.subjects

master = Tk()

max = 5
variables = {}
number = 1
subject_amount = 0
while number != (max+1):
    subject = f"Subject {number}"
    Subject1_Label = Label(master, text=subject)
    Subject1_Label.grid(row=number, column=0, pady=6)
    Subject1 = All_Subjects.get(number)
    variable = StringVar(master)
    variable.set(Subject1[0])
    variables[subject] = variable  # save the variable
    w = OptionMenu(master, variable, *Subject1)
    w.grid(row=number, column=1, pady=6)
    subject_amount = subject_amount + 1
    number = number + 1

def show_subjects():
    # use "Subject X" as key to get the selected subjects 
    for i in range(1, max+1):
        subject = f"Subject {i}"
        print(f"{subject}: {variables[subject].get()}")
    # or simply
    #print([var.get() for var in variables.values()])

Button(master, text="Next", command=show_subjects).grid(column=2, padx=10, pady=10)

master.mainloop()

输出:

【讨论】:

  • 这实际上不起作用。尝试 variables["Subject 1"] 时,它会为我提供下拉框中的任何内容,而不是用户实际选择的内容(如果有意义的话)。它不会取代用户选择的数学分机,而是取代数学广告。不太确定我还能做什么?一旦我单击“下一步”,我需要它来收集所有用户选择。尝试使用变量时,我还得到(AttributeError:'str'对象没有属性'get')[“Subject 1”].get()
  • 我可以做 variable.get() 但这只会收集最后一个下拉框而不是全部。
  • @ZacharyAmbrose 提供了一个适合我的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2018-01-08
相关资源
最近更新 更多