我有一个按钮,然后按下它就想创建新的按钮和新标签。
标签必须具有随机颜色,并且必须在按下此按钮时将其更改为另一种随机颜色。
我的代码甚至无法正确添加按钮,放置新字符时出现问题(大小很奇怪)。 我该如何改善?以后我又该如何为新按钮创建func,这些按钮会更改标签的颜色,因为我没有标签的名称。
import random
from tkinter import *
def color(*args):
pass
def dump( *args):
global count
Butt = Button(root, text="color ", command=color)
Butt.config(width=int(root.winfo_width() / 10), height=int(root.winfo_height() / 10))
Butt.grid(row=0, column=count)
Txt = Label(root, text="Color", bg="#" + ("%06x" % random.randint(0, 16777215)))
Txt.config(width=int(root.winfo_width() / 10), height=int(root.winfo_height() / 10))
Txt.grid(row=1, column=count)
count+=1
root.mainloop()
count=2
TKroot = Tk()
TKroot.title("Hello")
root = Frame(TKroot)
root.place(relx=0, rely=0, relheight=1, relwidth=1)
root.columnconfigure(0, weight=10)
root.columnconfigure(1, weight=10)
root.rowconfigure(0, weight=10)
root.rowconfigure(1, weight=10)
Butt = Button(root, text="Butt ON")
Butt.bind('<Button-1>', dump)
Butt.config(width=int(root.winfo_width() / 10), height=int(root.winfo_height() / 10))
Butt.grid(row=0, column=0)
Exit = Button(root, text="Quit!", command=root.quit)
Exit.config(width=int(root.winfo_width() / 10), height=int(root.winfo_height() / 10))
Exit.grid(row=0, column=1)
Txt = Label(root, text="This is a label", bg="PeachPuff")
Txt.grid(row=1, column=1, columnspan=1)
TKroot.mainloop()
print("Done")
答案 0 :(得分:1)
我发现您的代码存在一些问题。
第一,您正在使用place
作为框架。
添加新按钮时,这将导致问题,因为它将不允许窗口使用新布局正确调整大小。
2nd是您编写代码的方式。您将框架命名为root
,并在框架而不是实际的根窗口上使用quit
方法。编写事物的方式使操作变得更加困难,因此在编写代码时请考虑遵循PEP8准则。
3,您尝试在mainloop
函数中将dump
应用于框架。您只需要1个mainloop实例,这将应用于实际的根窗口(Tk()
)。
为解决您以后如何更改标签颜色的问题,我将使用一个列表来存储您的按钮和标签。这样,我们就可以引用它们的索引值,并将您的随机颜色代码应用于按钮单击时的标签上。
我已重新编写您的大多数代码以遵循PEP8并进行了一些常规清理。 如果您有任何问题,请告诉我。
import tkinter as tk
import random
def color(ndex):
button_label_list[ndex][1].config(bg="#%06x" % random.randint(0, 16777215))
def dump():
global count, button_label_list
button_label_list.append([tk.Button(frame, text="color", command=lambda x=count: color(x)),
tk.Label(frame, text="Color", bg="#" + ("%06x" % random.randint(0, 16777215)))])
button_label_list[-1][0].grid(row=0, column=count, sticky='nsew')
button_label_list[-1][1].grid(row=1, column=count, sticky='nsew')
frame.columnconfigure(count, weight=1)
count += 1
root = tk.Tk()
count = 0
button_label_list = []
root.title("Hello")
root.rowconfigure(1, weight=1)
root.columnconfigure(2, weight=1)
frame = tk.Frame(root)
frame.rowconfigure(1, weight=1)
frame.grid(row=0, column=2, sticky='nsew', rowspan=2)
tk.Button(root, text="butt ON", command=dump).grid(row=0, column=0, sticky='nsew')
tk.Button(root, text="Quit!", command=root.quit).grid(row=0, column=1, sticky='nsew')
tk.Label(root, text="This is a label", bg="PeachPuff").grid(row=1, column=1, columnspan=1, sticky='nsew')
root.mainloop()
结果:
一个可以添加新按钮并能够更改每个标签颜色的窗口。窗口开始时的主要2个按钮是静态的,因为它们不能像您的代码示例中那样从窗口中推出,而是保留在锚定位置的左侧。
答案 1 :(得分:1)
低于面向对象的版本。
每次按“颜色”按钮时,都会创建一个新标签和一个新按钮
并将标签引用放入字典中。
标签的颜色是随机产生的。
创建后,如果单击新按钮,我们将更改相对标签的颜色。
脚本中最酷的部分是:
command = lambda which = self.count:self.change_color(which)
lambda函数,用于保留对按钮的引用并仅标记
在我们调用change_color函数时创建。
import tkinter as tk
import random
class App(tk.Frame):
def __init__(self,):
super().__init__()
self.master.title("Hello World")
self.count = 0
self.labels = {}
self.init_ui()
def init_ui(self):
self.f = tk.Frame()
w = tk.Frame()
tk.Button(w, text="Color", command=self.callback).pack()
tk.Button(w, text="Close", command=self.on_close).pack()
w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=0)
self.f.pack(side=tk.LEFT, fill=tk.BOTH, expand=0)
def callback(self):
text_label = "I'm the {} label".format(self.count)
text_button = "I'm the {} button".format(self.count)
color = "#" + ("%06x" % random.randint(0, 16777215))
obj = tk.Label(self.f, text=text_label, bg=color)
obj.pack()
self.labels[self.count]=obj
tk.Button(self.f,
text=text_button,
command=lambda which=self.count: self.change_color(which)).pack()
self.count +=1
def change_color(self,which):
color = "#" + ("%06x" % random.randint(0, 16777215))
self.labels[which].config(bg=color)
def on_close(self):
self.master.destroy()
if __name__ == '__main__':
app = App()
app.mainloop()