[英]Python - Tkinter Manage Frames
我有一個小腳本,分為 3 個框架:
我按下第一行框架中的按鈕,將輸入值交給左側第二行的 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()
現在我的問題是:當我第二次按下“提交”按鈕時(按下重置按鈕后)什么也沒有發生:(
提前致謝!
您的程序無法正常工作的原因是,在MainLeftFrame
和MainRightFrame
上使用forget
后,當調用action
function 時,您不會再次打包它們。 在action
中添加這兩行代碼應該可以使它工作。 但
MainLeftFrame.pack()
MainRightFrame.pack()
這不是唯一的問題,每次調用 function 時定義新的小部件並打包它們會一遍又一遍地增加相同的小部件集。 為避免這種情況,您必須預先定義它們,然后它們會執行忘記和重新打包。 但更好的做法是為它們設置一個專用框架,以便您輕松切換。 我已經嘗試重寫你的腳本,如果這是你想要的,請告訴我。
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.