【问题标题】:Trying to produce function for a custom number of tkinter Entry fields.尝试为自定义数量的 tkinter 输入字段生成函数。
【发布时间】:2016-01-20 23:31:17
【问题描述】:

我一直在尝试创建一段将整数作为参数并创建该数量的 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)

【问题讨论】:

  • 你到底遇到了什么困难?
  • 你想要整个程序(包括创建根窗口)作为一个单独的函数吗?
  • 我不能只在我的代码中添加一个返回值,以便使它成为一个函数,因为它返回一个空列表。
  • 好吧,我希望能够在我的程序中多次调用它,是的,每次调用它时都会创建一个新窗口。但我可以将窗口初始化放在函数调用周围。
  • 这是您使用的唯一 GUI,还是现有 GUI 的补充?如果是现有 GUI 的补充,您将需要使用 TopLevel 之类的东西。

标签: python tkinter


【解决方案1】:

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

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

一种简单的方法是提供一个“确定”按钮,该按钮获取值然后销毁窗口。另一种方法是跟踪与每个条目关联的变量,并在编辑值时立即保存它们。

您选择哪种方法取决于当用户单击窗口控件关闭窗口时您想要的行为(例如: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)

【讨论】:

  • 谢谢,这绝对是完美的。希望我在开始编写程序之前知道 wait_window()。这将非常有用。现在我可以整理剩下的代码了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多