删除 Tkinter 按钮
Deleting a Tkinter button
每当我使用 destroy() 函数删除 tkinter 中的按钮时,tkinter gui window 中该按钮下方的所有其他小部件都会向上移动,从而在我的屏幕底部创建一个间隙。我不希望这发生。有什么办法可以防止小部件在删除按钮后移动?另请注意,我必须将按钮放在框架中的标签中,并且该框架位于主 gui window 中。这些是约束条件。
enter code here
from tkinter import *
screen = Tk()
screen.title("Kaun Banega Crorepati - The Game")
screen.geometry('1920x1080+0+0')
gameframe = Frame(screen, bg='#2e004d',width=1920,height=1080)
gameframe.pack()
panel = Label(gameframe, bg='#2e004d', width=1920, height=1080)
panel.pack()
def cmd():
optionc.destroy()
optiona = Button(panel, text='A.option', font='Arial 18 bold', bg='black',
fg='yellow')
optiona.pack(side='top', padx=40,pady=20)
optionb = Button(panel, text='B.option', font='Arial 18 bold', bg='black',
fg='yellow')
optionb.pack(side='top', padx=40,pady=20)
optionc = Button(panel, text='C.option', font='Arial 18 bold', bg='black',
fg='yellow')
optionc.pack(side='top', padx=40,pady=20)
optiond = Button(panel, text='D.option', font='Arial 18 bold', bg='black',
fg='yellow')
optiond.pack(side='top', padx=40,pady=20)
destroybutton=Button(panel,text='destroy',font='Arial 18 bold', bg='black',
fg='yellow',border=5,command=cmd)
destroybutton.pack(side='top', padx=40,pady=20)
screen.mainloop()
Question: preventing the widgets from shifting after deletion of a button
不使用动态的 Pack Geometry Manager,而是使用 Place Geometry Manager。
核心点:
.place(x=..., y=...)
参考:
- The Tkinter Place Geometry Manager
Allows you explicitly set the position and size of widgets, either in absolute terms, or relative to another widget.
注意:我推荐使用tk.Frame
作为容器,但你也可以改为tk.Label
。
定义 FixedPanel(tk.Frame)
容器 class。
扩展:
button=
: tuple(text, command)
的序列
def button(text)
: Returns 对匹配 text
. 的 Button
的引用
import tkinter as tk
class FixedPanel(tk.Frame):
def __init__(self, parent, **kwargs):
items = kwargs.pop('button', None)
super().__init__(parent, **kwargs)
for n, (text, command) in enumerate(items):
button = tk.Button(self, text=text, command=command,
font='Arial 18 bold', bg='black', fg='yellow')
button.place(x=20, y=(n * 60) + 20)
def button(self, text):
for child in list(self.children):
button = self.nametowidget(child)
if button['text'] == text:
return button
用法:
像使用任何其他 tkinter
小部件一样使用 class FixedPanel
。
要 .destroy()
a Button
,使用 panel.button(<text>)
获取 Button
的引用
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Kaun Banega Crorepati - The Game")
self.geometry('800x500+0+0')
self.panel = FixedPanel(self, bg='red', width=170, height=350,
button=(('A.option', None),
('B.option', None),
('C.option', None),
('D.option', None),
('destroy', self.cmd))
)
self.panel.pack()
def cmd(self):
self.panel.button('C.option').destroy()
if __name__ == "__main__":
App().mainloop()
测试 Python:3.5 - 'TclVersion':8.6 'TkVersion':8.6
每当我使用 destroy() 函数删除 tkinter 中的按钮时,tkinter gui window 中该按钮下方的所有其他小部件都会向上移动,从而在我的屏幕底部创建一个间隙。我不希望这发生。有什么办法可以防止小部件在删除按钮后移动?另请注意,我必须将按钮放在框架中的标签中,并且该框架位于主 gui window 中。这些是约束条件。
enter code here
from tkinter import *
screen = Tk()
screen.title("Kaun Banega Crorepati - The Game")
screen.geometry('1920x1080+0+0')
gameframe = Frame(screen, bg='#2e004d',width=1920,height=1080)
gameframe.pack()
panel = Label(gameframe, bg='#2e004d', width=1920, height=1080)
panel.pack()
def cmd():
optionc.destroy()
optiona = Button(panel, text='A.option', font='Arial 18 bold', bg='black',
fg='yellow')
optiona.pack(side='top', padx=40,pady=20)
optionb = Button(panel, text='B.option', font='Arial 18 bold', bg='black',
fg='yellow')
optionb.pack(side='top', padx=40,pady=20)
optionc = Button(panel, text='C.option', font='Arial 18 bold', bg='black',
fg='yellow')
optionc.pack(side='top', padx=40,pady=20)
optiond = Button(panel, text='D.option', font='Arial 18 bold', bg='black',
fg='yellow')
optiond.pack(side='top', padx=40,pady=20)
destroybutton=Button(panel,text='destroy',font='Arial 18 bold', bg='black',
fg='yellow',border=5,command=cmd)
destroybutton.pack(side='top', padx=40,pady=20)
screen.mainloop()
Question: preventing the widgets from shifting after deletion of a button
不使用动态的 Pack Geometry Manager,而是使用 Place Geometry Manager。
核心点:
.place(x=..., y=...)
参考:
- The Tkinter Place Geometry Manager
Allows you explicitly set the position and size of widgets, either in absolute terms, or relative to another widget.
注意:我推荐使用tk.Frame
作为容器,但你也可以改为tk.Label
。
定义 FixedPanel(tk.Frame)
容器 class。
扩展:
button=
:tuple(text, command)
的序列
def button(text)
: Returns 对匹配text
. 的
Button
的引用
import tkinter as tk
class FixedPanel(tk.Frame):
def __init__(self, parent, **kwargs):
items = kwargs.pop('button', None)
super().__init__(parent, **kwargs)
for n, (text, command) in enumerate(items):
button = tk.Button(self, text=text, command=command,
font='Arial 18 bold', bg='black', fg='yellow')
button.place(x=20, y=(n * 60) + 20)
def button(self, text):
for child in list(self.children):
button = self.nametowidget(child)
if button['text'] == text:
return button
用法:
像使用任何其他 tkinter
小部件一样使用 class FixedPanel
。
要 .destroy()
a Button
,使用 panel.button(<text>)
Button
的引用
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Kaun Banega Crorepati - The Game")
self.geometry('800x500+0+0')
self.panel = FixedPanel(self, bg='red', width=170, height=350,
button=(('A.option', None),
('B.option', None),
('C.option', None),
('D.option', None),
('destroy', self.cmd))
)
self.panel.pack()
def cmd(self):
self.panel.button('C.option').destroy()
if __name__ == "__main__":
App().mainloop()
测试 Python:3.5 - 'TclVersion':8.6 'TkVersion':8.6