在按下按钮时在TkInter中添加按钮

时间:2019-03-20 15:08:47

标签: python user-interface tkinter

我有一个按钮,然后按下它就想创建新的按钮和新标签。

标签必须具有随机颜色,并且必须在按下此按钮时将其更改为另一种随机颜色。

我的代码甚至无法正确添加按钮,放置新字符时出现问题(大小很奇怪)。  我该如何改善?以后我又该如何为新按钮创建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")

2 个答案:

答案 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个按钮是静态的,因为它们不能像您的代码示例中那样从窗口中推出,而是保留在锚定位置的左侧。

enter image description here

答案 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()