Python - Tkinter 管理框架

问题描述

我有一个由 3 个框架组成的小脚本:

  • 第一行 1
  • 第二行左1
  • 第二行右侧的 1

我按下第一行框架中的按钮,将输入值交给左侧第二行的 Label。

这是我的代码

import tkinter as tk

# Create Window
root = tk.Tk()

# Define String Variable
Name = tk.StringVar()

# Organize root window in 3 frames
EntryFrame = tk.Frame(root)
MainLeftFrame = tk.Frame(root)
MainRightFrame = tk.Frame(root)

# Create Buttons,Entry and Labels

NameLabel = tk.Label(MainLeftFrame,textvariable=Name)
InputName = tk.Entry(EntryFrame,width=20,bg='yellow')
SubmitButton = tk.Button(EntryFrame,text='Submit',command=lambda:action())

# Define what happens when press button reset
def reset():
    MainLeftFrame.forget()
    MainRightFrame.forget()
    EntryFrame.pack()

# Define what happens when button is pressed
def action():
    Name.set(InputName.get())
    ResetButton = tk.Button(MainRightFrame,text='Reset',command=lambda: reset())
    ResetButton.pack()
    Placeholder = tk.Label(MainRightFrame,text="place holder")
    Placeholder.pack(side="top")
    EntryFrame.forget()

# Pack Widgets
EntryFrame.pack(side='top')
MainLeftFrame.pack(side='left')
MainRightFrame.pack(side='right')

InputName.pack()
SubmitButton.pack()
NameLabel.pack()

#mainloop
root.mainloop()

现在我的问题: 当我第二次按下“提交”按钮(按下重置按钮后)时,什么也没有发生:(

提前致谢!

解决方法

您的程序不工作的原因是,在 forgetMainLeftFrame 上使用 MainRightFrame 后,您不会在调用 action 函数时再次打包它们.在 action 函数中添加这两行代码应该可以使它工作。但是

MainLeftFrame.pack()
MainRightFrame.pack()

这不是唯一的问题,每次调用函数时都定义新的小部件并打包它们会一遍又一遍地增加相同的小部件集。为避免这种情况,您必须预先定义它们,然后它们执行忘记和重新打包。但更好的做法是为它们配备一个专用框架,这样您就可以轻松切换。我试过重写你的脚本,如果这是你想要的,请告诉我。

from tkinter import *

def reset():
    entry_frame.pack()
    main_frame.pack_forget()

def submit():
    entry_frame.pack_forget()
    main_frame.pack()
    name.set(name_entry.get())

root=Tk()

entry_frame=Frame(root)
entry_frame.pack()
name_entry=Entry(entry_frame)
name_entry.pack(side='top')
submit_button=Button(entry_frame,text='Submit',command=submit)
submit_button.pack(side='top')

main_frame=Frame(root)
reset_button=Button(main_frame,text='Reset',command=reset)
reset_button.pack(side='top')
name=StringVar()
name_label=Label(main_frame,textvariable=name)
name_label.pack(side='left')
placeholer_label=Label(main_frame,text='placeholer')
placeholer_label.pack(side='right')

root.mainloop()