尝试为自定义数量的tkinter输入字段生成函数。

时间:2016-01-20 23:31:17

标签: python tkinter

我一直在尝试创建一段代码,该代码将整数作为参数并创建该数量的tkinter条目字段。使用末尾的提交按钮将从字段中检索数据,将这些数据添加到列表中,然后关闭窗口。

我能够让它工作但是我找不到将其转换为可调用函数的方法;要求将其与我的程序的其余部分一起使用。 这是我到目前为止制作的代码,谢谢:

import tkinter as tk

b = input("Enter: ")
b = int(b)

root = tk.Tk()

newdict = dict()

outputs = list()

for i in range(b):
    newdict["entry" + str(i)] = tk.Entry(root)
    newdict["entry" + str(i)].pack()

button1 = tk.Button(root, text="Submit", command=lambda: Get(newdict))
button1.pack()

def Get(newdict):
    for j in range(b):
        outputs.append(newdict["entry" + str(j)].get())
        root.quit()

root.mainloop()

print(outputs)

1 个答案:

答案 0 :(得分:1)

基本思想是创建一个窗口,然后使用wait_window方法等待窗口被销毁。一旦它被销毁,你可以返回一些价值。

问题是您要获取的值不能是窗口的属性,因为它在您准备提取它们时就已经被破坏了。您需要设置代码以在销毁窗口之前保存值。

一种简单的方法是提供一个" OK"获取值然后销毁窗口的按钮。另一种方法是跟踪与每个条目相关的变量,并在编辑时立即保存这些值。

您选择哪种方法取决于用户单击窗口控件以关闭窗口时所需的行为(例如:OSX上的红色圆圈,Windows上的[x]按钮等)。你想要返回他们输入的内容,还是将其视为取消操作而不返回任何内容?

这是一个使用OK按钮的简单示例。此示例假定您尚未运行GUI,并且此操作将作为非GUI应用程序的一部分运行。

import tkinter as tk

class Dialog(object):
    def show(self, num_fields):
        self.num_fields = num_fields
        self.root = tk.Tk()
        self.entries = []
        for i in range(num_fields):
            entry = tk.Entry(self.root)
            entry.pack(fill="x")
            self.entries.append(entry)

        ok = tk.Button(self.root, text="OK", command=self.ok)
        ok.pack(side="bottom", anchor="e", pady=(10,0), padx=10)

        # wait for the window to be destroyed, then
        # return the values. If the user clicks the OK button
        # the values will be set; if they cancel the dialog
        # this will return None.
        self.values = None
        self.root.wait_window()
        return self.values

    def ok(self):
        # save all the values, then destroy the window
        self.values = []
        for i in range(self.num_fields):
            self.values.append(self.entries[i].get())

        self.root.destroy()

假设你正在运行一个非gui程序,这里有一个如何使用这个类的例子:

b = input("Enter: ")
b = int(b)
result = Dialog().show(b)
print("result:", result)