我怎样才能做到当在 Tkinter 中单击一个按钮时,当前显示在屏幕上的任何和所有标签都被新标签替换?
How can I make it so that when a button is clicked in Tkinter, any and all labels currently displayed on the screen are replaced with the new label?
所以我正在 Python 中进行一个交互式周期性 table 项目,并且正在使用 Tkinter。我上面有按钮,单击时会提供有关按钮上命名的元素的信息。它将此作为标签输出,并在 5.5 秒后自动消失。我需要做一件事,但似乎找不到解决方案:
我需要设置一次只能显示一个标签。目前,如果我多次单击相同或不同的按钮,标签会相互堆叠。我希望只有一个标签,因此如果单击一个新按钮,该标签将替换另一个。
这是主要代码,包括所有 Tkinter 内容。我还将在底部包含我用所有定期 table 库内容制作的其他文件。
from elementsymbols import *
from tkinter import *
def callback_h():
labelh = Label(root, text="Element name: " + str(h.name) + "\n" + "Element symbol: " + str(h.symbol) + "\n" + "Atomic mass: " + str(h.atomic_weight) + "\n" + "Atomic number: " + str(h.atomic_number))
labelh.pack()
labelh.after(5500, lambda: labelh.config(text=''))
def callback_he():
labelhe = Label(root, text="Element name: " + str(he.name) + "\n" + "Element symbol: " + str(he.symbol) + "\n" + "Atomic mass: " + str(he.atomic_weight) + "\n" + "Atomic number: " + str(he.atomic_number))
labelhe.pack()
labelhe.after(5500, lambda: labelhe.config(text=''))
def callback_li():
labelli = Label(root, text="Element name: " + str(li.name) + "\n" + "Element symbol: " + str(li.symbol) + "\n" + "Atomic mass: " + str(li.atomic_weight) + "\n" + "Atomic number: " + str(li.atomic_number))
labelli.pack()
labelli.after(5500, lambda: labelli.config(text=''))
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.init_window()
# Creation of init_window
def init_window(self):
# changing the title of our master widget
self.master.title("Interactive Periodic Table v1")
# allowing the widget to take the full space of the root window
self.pack(fill=BOTH, expand=1)
# creating a button instance
hbutton = Button(self, text="Hydrogen - H", command=callback_h)
# placing the button on my window
hbutton.place(x=0, y=0)
# all other elements
hebutton = Button(self, text="Helium - He", command=callback_he)
hebutton.place(x=100, y=0)
libutton = Button(self, text="Lithium - Li", command=callback_li)
libutton.place(x=190, y=0)
root = Tk()
# size of the window
root.geometry("600x500")
app = Window(root)
root.mainloop()
这是主要代码,这里是从以下位置获取定期 table 信息的地方:
from mendeleev import element
h = element('H')
he = element('He')
li = element('Li')
be = element('Be')
b = element('B')
c = element('C')
n = element('N')
o = element('O')
f = element('F')
ne = element('Ne')
na = element('Na')
mg = element('Mg')
al = element('Al')
si = element('Si')
p = element('P')
s = element('S')
cl = element('Cl')
ar = element('Ar')
k = element('K')
ca = element('Ca')
sc = element('Sc')
ti = element('Ti')
v = element('V')
cr = element('Cr')
任何与此相关的帮助都将不胜感激,但是与我的代码相关的实际代码示例将非常有用并且非常感谢。
您可以在列表中保留对标签的引用,然后在回调期间遍历它们并根据需要更改它们 text/destroy/hide/show。
def callback:
for lbl in my_labels:
# Destroy the previous labels
lbl.destroy()
# Or disable it using something like lbl.pack_forget()
# Create new label or whatever
new_label = Label(root... etc, etc.
需要做的是root=Tk()
需要移到最上面,然后标签需要在外面创建。最终代码如下所示。
from elementsymbols import *
from tkinter import *
root = Tk()
labelh = Label()
labelhe = Label()
labelli = Label()
labelbe = Label()
def remove():
labelh.config(text='')
labelhe.config(text='')
labelli.config(text='')
labelbe.config(text='')
def callback_h():
remove()
labelh.config(text="Element name: " + str(h.name) + "\n" + "Element symbol: " + str(h.symbol) + "\n" + "Atomic mass: " + str(h.atomic_weight) + "\n" + "Atomic number: " + str(h.atomic_number))
labelh.after(5500, lambda: labelh.config(text=''))
labelh.pack()
def callback_he():
remove()
labelhe.config(text="Element name: " + str(he.name) + "\n" + "Element symbol: " + str(he.symbol) + "\n" + "Atomic mass: " + str(he.atomic_weight) + "\n" + "Atomic number: " + str(he.atomic_number))
labelhe.after(5500, lambda: labelhe.config(text=''))
labelhe.pack()
def callback_li():
remove()
labelli.config(text="Element name: " + str(li.name) + "\n" + "Element symbol: " + str(li.symbol) + "\n" + "Atomic mass: " + str(he.atomic_weight) + "\n" + "Atomic number: " + str(li.atomic_number))
labelli.after(5500, lambda: labelli.config(text=''))
labelli.pack()
def callback_be():
remove()
labelbe.config(text="Element name: " + str(be.name) + "\n" + "Element symbol: " + str(be.symbol) + "\n" + "Atomic mass: " + str(be.atomic_weight) + "\n" + "Atomic number: " + str(be.atomic_number))
labelbe.after(5500, lambda: labelbe.config(text=''))
labelbe.pack()
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.init_window()
# Creation of init_window
def init_window(self):
# changing the title of our master widget
self.master.title("Interactive Periodic Table v1")
# allowing the widget to take the full space of the root window
self.pack(fill=BOTH, expand=1)
# creating a button instance
hbutton = Button(self, text="Hydrogen - H", command=callback_h)
# placing the button on my window
hbutton.place(x=0, y=0)
# all other elements
hebutton = Button(self, text="Helium - He", command=callback_he)
hebutton.place(x=100, y=0)
libutton = Button(self, text="Lithium - Li", command=callback_li)
libutton.place(x=190, y=0)
bebutton = Button(self, text="Beryllium - Be", command=callback_be)
bebutton.place(x=275, y=0)
# size of the window
root.geometry("600x500")
app = Window(root)
root.mainloop()
所以我正在 Python 中进行一个交互式周期性 table 项目,并且正在使用 Tkinter。我上面有按钮,单击时会提供有关按钮上命名的元素的信息。它将此作为标签输出,并在 5.5 秒后自动消失。我需要做一件事,但似乎找不到解决方案:
我需要设置一次只能显示一个标签。目前,如果我多次单击相同或不同的按钮,标签会相互堆叠。我希望只有一个标签,因此如果单击一个新按钮,该标签将替换另一个。
这是主要代码,包括所有 Tkinter 内容。我还将在底部包含我用所有定期 table 库内容制作的其他文件。
from elementsymbols import *
from tkinter import *
def callback_h():
labelh = Label(root, text="Element name: " + str(h.name) + "\n" + "Element symbol: " + str(h.symbol) + "\n" + "Atomic mass: " + str(h.atomic_weight) + "\n" + "Atomic number: " + str(h.atomic_number))
labelh.pack()
labelh.after(5500, lambda: labelh.config(text=''))
def callback_he():
labelhe = Label(root, text="Element name: " + str(he.name) + "\n" + "Element symbol: " + str(he.symbol) + "\n" + "Atomic mass: " + str(he.atomic_weight) + "\n" + "Atomic number: " + str(he.atomic_number))
labelhe.pack()
labelhe.after(5500, lambda: labelhe.config(text=''))
def callback_li():
labelli = Label(root, text="Element name: " + str(li.name) + "\n" + "Element symbol: " + str(li.symbol) + "\n" + "Atomic mass: " + str(li.atomic_weight) + "\n" + "Atomic number: " + str(li.atomic_number))
labelli.pack()
labelli.after(5500, lambda: labelli.config(text=''))
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.init_window()
# Creation of init_window
def init_window(self):
# changing the title of our master widget
self.master.title("Interactive Periodic Table v1")
# allowing the widget to take the full space of the root window
self.pack(fill=BOTH, expand=1)
# creating a button instance
hbutton = Button(self, text="Hydrogen - H", command=callback_h)
# placing the button on my window
hbutton.place(x=0, y=0)
# all other elements
hebutton = Button(self, text="Helium - He", command=callback_he)
hebutton.place(x=100, y=0)
libutton = Button(self, text="Lithium - Li", command=callback_li)
libutton.place(x=190, y=0)
root = Tk()
# size of the window
root.geometry("600x500")
app = Window(root)
root.mainloop()
这是主要代码,这里是从以下位置获取定期 table 信息的地方:
from mendeleev import element
h = element('H')
he = element('He')
li = element('Li')
be = element('Be')
b = element('B')
c = element('C')
n = element('N')
o = element('O')
f = element('F')
ne = element('Ne')
na = element('Na')
mg = element('Mg')
al = element('Al')
si = element('Si')
p = element('P')
s = element('S')
cl = element('Cl')
ar = element('Ar')
k = element('K')
ca = element('Ca')
sc = element('Sc')
ti = element('Ti')
v = element('V')
cr = element('Cr')
任何与此相关的帮助都将不胜感激,但是与我的代码相关的实际代码示例将非常有用并且非常感谢。
您可以在列表中保留对标签的引用,然后在回调期间遍历它们并根据需要更改它们 text/destroy/hide/show。
def callback:
for lbl in my_labels:
# Destroy the previous labels
lbl.destroy()
# Or disable it using something like lbl.pack_forget()
# Create new label or whatever
new_label = Label(root... etc, etc.
需要做的是root=Tk()
需要移到最上面,然后标签需要在外面创建。最终代码如下所示。
from elementsymbols import *
from tkinter import *
root = Tk()
labelh = Label()
labelhe = Label()
labelli = Label()
labelbe = Label()
def remove():
labelh.config(text='')
labelhe.config(text='')
labelli.config(text='')
labelbe.config(text='')
def callback_h():
remove()
labelh.config(text="Element name: " + str(h.name) + "\n" + "Element symbol: " + str(h.symbol) + "\n" + "Atomic mass: " + str(h.atomic_weight) + "\n" + "Atomic number: " + str(h.atomic_number))
labelh.after(5500, lambda: labelh.config(text=''))
labelh.pack()
def callback_he():
remove()
labelhe.config(text="Element name: " + str(he.name) + "\n" + "Element symbol: " + str(he.symbol) + "\n" + "Atomic mass: " + str(he.atomic_weight) + "\n" + "Atomic number: " + str(he.atomic_number))
labelhe.after(5500, lambda: labelhe.config(text=''))
labelhe.pack()
def callback_li():
remove()
labelli.config(text="Element name: " + str(li.name) + "\n" + "Element symbol: " + str(li.symbol) + "\n" + "Atomic mass: " + str(he.atomic_weight) + "\n" + "Atomic number: " + str(li.atomic_number))
labelli.after(5500, lambda: labelli.config(text=''))
labelli.pack()
def callback_be():
remove()
labelbe.config(text="Element name: " + str(be.name) + "\n" + "Element symbol: " + str(be.symbol) + "\n" + "Atomic mass: " + str(be.atomic_weight) + "\n" + "Atomic number: " + str(be.atomic_number))
labelbe.after(5500, lambda: labelbe.config(text=''))
labelbe.pack()
class Window(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.master = master
self.init_window()
# Creation of init_window
def init_window(self):
# changing the title of our master widget
self.master.title("Interactive Periodic Table v1")
# allowing the widget to take the full space of the root window
self.pack(fill=BOTH, expand=1)
# creating a button instance
hbutton = Button(self, text="Hydrogen - H", command=callback_h)
# placing the button on my window
hbutton.place(x=0, y=0)
# all other elements
hebutton = Button(self, text="Helium - He", command=callback_he)
hebutton.place(x=100, y=0)
libutton = Button(self, text="Lithium - Li", command=callback_li)
libutton.place(x=190, y=0)
bebutton = Button(self, text="Beryllium - Be", command=callback_be)
bebutton.place(x=275, y=0)
# size of the window
root.geometry("600x500")
app = Window(root)
root.mainloop()