【发布时间】: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 的建议进行操作并发布更多代码。 -
我在上面编辑了我的代码。如果你运行这个,你会看到问题。