【问题标题】:Python - Tkinter Manage FramesPython - Tkinter 管理框架
【发布时间】:2021-05-20 07:57:40
【问题描述】:

我有一个分成 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()

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

提前致谢!

【问题讨论】:

  • action 函数中根据您的需要使用EntryFrame.destroy()EntryFrame.pack_forget()。前者将永久删除小部件,后者将暂时将其从可见性中删除。
  • 您好,首先感谢您的回答,我尝试使用忘记,但仍然无法像我想要的那样工作。我调整了上面的代码,你知道为什么第二次点击“提交”按钮没有显示任何内容吗?

标签: python tkinter hide frames


【解决方案1】:

您的程序不工作的原因是,在MainLeftFrameMainRightFrame 上使用forget 之后,当调用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()

【讨论】:

  • 这正是我每次得到越来越多的小部件的问题。尝试了您的代码并针对我的脚本进行了调整,它现在对我来说是正确的。非常感谢您的帮助,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2017-12-24
  • 2021-09-18
  • 1970-01-01
  • 2018-02-03
相关资源
最近更新 更多