【问题标题】:How to pass data between top levels in tkinter如何在 tkinter 的顶层之间传递数据
【发布时间】:2019-07-26 08:07:40
【问题描述】:

我对 tkinter 完全陌生。我正在尝试在两个窗口之间传递数据。根窗口上有一个按钮。按下按钮将打开顶层。顶层窗口中有两个输入字段和一个提交按钮。用户可以输入两个数字并提交。我想要实现的是,按下提交按钮应该关闭顶层,结果(总和)应该显示在根窗口中。如何将输入字段数据传递到根窗口?

from tkinter import *
root= Tk()
root.geometry('600x400')
sum_var= StringVar()

def entry_Fn():
    level_1 = Toplevel(root)
    Label( level_1, text = "level one").pack()
    entry_1 =Entry(level_1)
    entry_1.pack()
    entry_2 =Entry(level_1)
    entry_2.pack()
    Button(level_1, text= "submit", command= submitBtn ).pack()

def submitBtn():
    val_1= entry_1.get()
    val_2= entry_2.get()
    sum_var.set(int(val_1)+ int(val_2))

Label(root, text = "Main window").pack()
Button(root, text= "To enter Data", command= entry_Fn).pack()
sum = Label(root, textvariable = sum_var)
sum.pack()

root.mainloop()
#result
val_1= entry_1.get()
NameError: name 'entry_1' is not defined

#shall I define some global variables?

【问题讨论】:

  • 您是否尝试过将输入框作为 submitBtn() 函数的参数?

标签: python tkinter


【解决方案1】:

在这种情况下,您不必声明global。只需在 entry_Fn 中缩进 submitBtn 函数即可:

def entry_Fn():
    level_1 = Toplevel(root)
    Label( level_1, text = "level one").pack()
    entry_1 = Entry(level_1)
    entry_1.pack()
    entry_2 = Entry(level_1)
    entry_2.pack()
    def submitBtn():
        val_1= entry_1.get()
        val_2= entry_2.get()
        sum_var.set(int(val_1)+ int(val_2))
        level_1.destroy()
    Button(level_1, text= "submit", command=submitBtn).pack()

但通常创建一个类更容易,因此您可以避免这种范围问题,如下所示:

from tkinter import *

class GUI(Tk):
    def __init__(self):
        super().__init__()
        self.geometry('600x400')
        self.sum_var= StringVar()
        Label(self, text="Main window").pack()
        Button(self, text="To enter Data", command=self.entry_Fn).pack()
        sum = Label(self, textvariable=self.sum_var)
        sum.pack()

    def entry_Fn(self):
        self.level_1 = Toplevel(self)
        Label(self.level_1, text = "level one").pack()
        self.entry_1 = Entry(self.level_1)
        self.entry_1.pack()
        self.entry_2 = Entry(self.level_1)
        self.entry_2.pack()
        Button(self.level_1, text="submit", command=self.submitBtn).pack()

    def submitBtn(self):
        val_1 = self.entry_1.get()
        val_2 = self.entry_2.get()
        self.sum_var.set(int(val_1)+ int(val_2))
        self.level_1.destroy()

root = GUI()

root.mainloop()

【讨论】:

  • 按下提交按钮后不会关闭顶层。如何自动关闭顶层?
  • 就像任何小部件一样,您可以在顶层调用destroy 方法。我已经编辑了我的答案。
【解决方案2】:

对于您的情况,您可以简单地将这两个条目传递给 submitBtn() 函数:

def submitBtn(entry_1, entry_2):
    ....

然后更新command=entry_Fn()内的提交按钮:

Button(level_1, text="submit", command=lambda: submitBtn(entry_1, enter_2)).pack()

【讨论】:

  • 但它不会关闭顶层。按下提交按钮时如何关闭顶层? destroy() 方法?
  • 要关闭Toplevel窗口,您可以将level_1也传递给提交按钮并在提交函数中调用level_1.destroy(),或者在lambda函数中关闭它:command=lambda:(submitBtn(entry_1,enter_2), level_1.destroy())
【解决方案3】:

您可以继承tk.TopLevel,并使用tk.IntVar 将数据传输回根:

import tkinter as tk


class EntryForm(tk.Toplevel):

    def __init__(self, master, sum_var):
        super().__init__(master)
        tk.Label(self, text="level one").pack()
        self.sum_var = sum_var
        self.entry_1 = tk.Entry(self)
        self.entry_1.pack()
        self.entry_2 = tk.Entry(self)
        self.entry_2.pack()
        tk.Button(self, text="submit", command=self.submitBtn).pack()

    def submitBtn(self):
        val_1 = self.entry_1.get()
        val_2 = self.entry_2.get()
        self.sum_var.set(int(val_1) + int(val_2))
        self.destroy()

def spawn_entry_popup():
    EntryForm(root, sum_var)

root= tk.Tk()
root.geometry('600x400')
sum_var = tk.IntVar()
tk.Label(root, text = "Main window").pack()
tk.Button(root, text= "To enter Data", command=spawn_entry_popup).pack()
sum_label = tk.Label(root, textvariable=sum_var)
sum_label.pack()

root.mainloop()

你也可以将你的应用放在一个类中:

import tkinter as tk


class EntryForm(tk.Toplevel):

    def __init__(self, master, sum_var):
        super().__init__(master)
        tk.Label(self, text="level one").pack()
        self.sum_var = sum_var
        self.entry_1 = tk.Entry(self)
        self.entry_1.pack()
        self.entry_2 = tk.Entry(self)
        self.entry_2.pack()
        tk.Button(self, text="submit", command=self.submitBtn).pack()

    def submitBtn(self):
        val_1 = self.entry_1.get()
        val_2 = self.entry_2.get()
        self.sum_var.set(int(val_1) + int(val_2))


class GUI(tk.Tk):

    def __init__(self):    
        super().__init__()
        self.geometry('600x400')
        self.sum_var = tk.IntVar()
        tk.Label(self, text = "Main window").pack()
        tk.Button(self, text= "To enter Data", command=self.spawn_entry_popup).pack()
        sum_label = tk.Label(self, textvariable=self.sum_var)
        sum_label.pack()

    def spawn_entry_popup(self):
        EntryForm(self, self.sum_var)


GUI().mainloop()

【讨论】:

  • 但是当我按下提交按钮时如何自动关闭顶层窗口?
  • 抱歉,我错过了那部分 - 你在更新 self. sum_var 后简单地销毁了 Toplevel - 我编辑了代码。
猜你喜欢
  • 2020-07-20
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多