【问题标题】:Tkinter delete values in Entries, when I'm changing the Frame当我更改框架时,Tkinter 删除条目中的值
【发布时间】:2020-07-30 00:13:14
【问题描述】:

我用 Tkinter 编写了一个带有多个窗口的 GUI。这些窗口中的每一个都有自己的条目。当我在条目中输入值并使用方法tkraise() 突出显示另一个窗口时,这些值将被删除。

有谁知道我可以做些什么来保留条目中的值,即使我在窗口之间进行更改?

如果用户在窗口之间切换 (Frames),我是否必须先使用 entryXYZ.get() 保存值并再次设置条目中的值?

import tkinter as tk

class Win1:
    

    def __init__(self, master):
        
        
        self.master = master
        self.master.title("Gap Assessment")
        self.topFrame = tk.Frame(self.master)
        self.topFrame.grid(row=0, column=0, sticky='news', ipady = 5)
        self.A_GapFrame = tk.Frame(self.master)
        self.B_GapFrame = tk.Frame(self.master)
       
        # Create a Tkinter variable
        self.gapType = tk.StringVar(self.master)
        # Dictionary with options
        self.choiceGap =  ['AFrame','BFrame']
        # self.choiceGap = sorted(self.choiceGap)
        self.gapType.set('') # set the default option
        self.ctngMenu = tk.OptionMenu(self.topFrame, self.gapType, *self.choiceGap, command=self.chioseGap_handle)
        self.ctngMenu.grid(row = 1, column =2)

    def chioseGap_handle(self, selected):

        if selected == 'AFrame':
            self.A_GapFrame.tkraise()
            self.subframe_AGap()
            self.A_GapFrame.grid(row=2, column=0, sticky='news')
            
        if selected == 'BFrame':
            self.B_GapFrame.tkraise()
            self.subframe_BGap()
            self.B_GapFrame.grid(row=2, column=0, sticky='news')   
                
    def subframe_AGap(self):
            self.jobNameA_text = tk.StringVar()
            self.jobNameA_entry = tk.Entry(self.A_GapFrame, textvariable = self.jobNameA_text)
            self.jobNameA_entry.grid(row=1, column=0, sticky='news') 
            
    def subframe_BGap(self):
            
            self.jobNameB_text = tk.StringVar()
            self.jobNameB_entry = tk.Entry(self.B_GapFrame, textvariable = self.jobNameB_text)
            self.jobNameB_entry.grid(row=2, column=0, sticky='news') 
        

        

root = tk.Tk()
root.geometry("+50+50")
app = Win1(root)
root.mainloop()

当我在self.jobNameA_text 中输入一些文本后,我命令切换到Frame B_GapFrame.tkraise(),我在A_GapFrame() 中的所有值都将被删除。

有其他想法可以解决这个问题吗?

【问题讨论】:

  • 怎么知道切换到其他frame后entry的内容被删除了?
  • 这很难说,因为您没有发布minimal reproducible example,但看起来您在显示框架时正在重新创建小部件,而不是继续使用已经存在的小部件.新的小部件当然不会有旧的内容。
  • 是的。你说的对。当我显示框架时,我正在重新创建小部件。你知道我该如何解决这个问题吗?
  • 很难说没有看到你的 tkinter 应用程序的整体架构。由于您使用tkraise() 来显示框架,因此每次显示时都不需要在其中重新创建小部件-tkraise() 调用它将使Frame 的内容可见并隐藏任何其他“下方”。要获得明确的答案,您需要按照@jasonharper 的建议进行操作并发布更多代码。
  • 我在上面编辑了我的代码。如果你运行这个,你会看到问题。

标签: python tkinter


【解决方案1】:

我会在 init 函数中声明我的小部件,然后使用该函数简单地放置它们,使其保持不变。

classMyGui:

    def __init__(self):
        # you should initialize all your variables in the init function...
        self.jobNameA_text = tk.StringVar()
        self.jobNameA_entry = tk.Entry(self.sub_AGapCanvas, textvariable self.jobNameA_text)
        self.main()

   def subframe_AGap(self):                          
        self.jobNameA_entry.place(x=130, y=120, width = 210)
        self.jobNameA_entry.configure({"background": "light green"})

    def main(self):
        self.A_GapFrame.tkraise()
        self.subframe_AGap()
        self.A_GapFrame.grid(row=2, column=0, sticky='news')

我不喜欢使用多个窗口,我通常也会做一个忘记功能,这样我就可以重复使用空间。

def subframe_AGap_forget(self):                          
        self.jobNameA_entry.place_forget()

这样我就无法再看到该小部件,但它仍然存在,以备我再次需要它时使用。希望这对您有所帮助。

【讨论】:

  • 我在上面编辑了我的代码。如果你运行它,你会看到问题。将变量放入init函数中是否会解决同样的问题?
  • 是的,这很有帮助。非常感谢。我能问你,为什么我的问题在将变量放入 init 函数中得到解决?
  • 就是你只运行了一次init函数。在每次运行函数之前,您都会创建一个没有您输入的新条目小部件,尽管它看起来相同,因为它是使用相同的代码创建的。
  • 谢谢。是的你是对的。但是下一个问题是,当我调用 BFrame 时,来自 AFrame 的小部件不会消失。出于这个原因,BFrame 包含不应该在其中的小部件。你知道在这种情况下我能做什么吗?你说我应该隐藏它们,但在 4 个不同的框架中附近有 500 个小部件。你知道我怎样才能有效地隐藏它们吗?
  • 假设它们都被分配到相应的画布上,你应该能够 .grid_forget() 或 .grid_remove() 画布。 Forget 需要再次分配网格值,但 remove 会记住这些值。
猜你喜欢
  • 1970-01-01
  • 2022-06-28
  • 2023-03-28
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多