繁体   English   中英

Tkinter按钮颜色无故闪烁

[英]Tkinter button color flashing for no reason

我正在制作一个刷新函数来更改tkinter中按钮的颜色,问题是该颜色必须来自另一个返回字符串的函数,并且每次我更新所有内容时都会闪烁一下。

我尝试使用StringVar()并仅更新颜色而不更新整个布局,但是它只会卡在循环中而从不显示布局。 我还尝试将所有对象都转储到列表中,然后立即更改整个网格,而不是一次又一次地更改网格,但没有成功。

该代码的核心是:

root = Tk()
frame=Frame(root)
root.title("States")
Grid.rowconfigure(root, 0, weight=1)
Grid.columnconfigure(root, 0, weight=1)
frame.grid(row=0, column=0, sticky=N+S+E+W)
grid=Frame(frame)
grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2)
Grid.rowconfigure(frame, 7, weight=1)
Grid.columnconfigure(frame, 0, weight=1)

def loop_1():
        for x in range(4):
            for y in range(3):
                btnxy(x,y,frame)
        for x in range(4):
            Grid.columnconfigure(frame, x, weight=1)
        for y in range(3):
            Grid.rowconfigure(frame, y, weight=1)
        root.after(1000,loop_1)
loop_1()

btnxy创建一个按钮并将其放置在网格中

def btnxy(x,y,frame):
    index=4*y+x+1
    if index>8:
        message="Relay "+str(index-8)
        btn = Button(frame,text=message, command=lambda p=(index-8): Relay(index-8), bg="blue", relief="groove", height=10, width=30)
    else:
        message="Entrée "+str(index)
        color=check_color(index)
        btn = Button(frame,text=message, command="", bg=color, relief="groove", height=10, width=30)
    btn.grid(column=x, row=y, sticky=N+S+E+W

而check_color是一个返回“红色”或“绿色”字符串的函数

据我了解,这应该不需要太多的处理能力,因此更新比较容易,但是会闪烁。

我试图对您的代码进行一些修改,但老实说,我无法使其正常工作,并且不了解其背后的逻辑。 有很多问题是不对的:

1)全球进口不好。 不要from tkinter import * 而是将import tkinter as tk 这样可以提高可读性,使事情更明确,并具有许多其他好处(您可以在Google上轻松找到更多信息)

2)您可以使用功能loop1将按钮放置在所需的帧中。 一切都很好,但是您不要将框架作为参数传递,对于root也是一样。 如果确实修改了代码以解决此问题,您将看到闪烁消失,尽管由于缺少参数, root.after也会遇到问题。

解决方案是更改应用程序的结构,以便可以轻松访问和使用按钮和根目录。 入门的方法可以是以下代码:

import tkinter as tk
from random import shuffle


def get_random_colors():
    colors = ["red" for i in range(4)] + ["blue" for i in range(4)] + ["green" for i in range(4)]
    shuffle(colors)
    return colors


class MyGUI(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        self.frame = tk.Frame()
        self.frame.pack()

        self.n_rows = 3
        self.n_cols = 4

        self.bt_list = []

        for x in range(self.n_rows):
            for y in range(self.n_cols):
                self.bt_list.append(tk.Button(self.frame, text="Button {}.{}".format(x, y)))
                self.bt_list[-1].grid(row=x, column=y)

    def change_colors(self):
        colors = get_random_colors()
        for index, button in enumerate(self.bt_list):
            button.configure(bg=colors[index])
        self.after(5000, self.change_colors)

root = MyGUI()
root.after(5000, root.change_colors)
root.mainloop()

首先,主框架现在是该类的一个属性,因此只要将self传递给函数,只要我在类中需要它,只要调用self.frame就足够了。
然后,我决定将按钮存储在列表中,这样我就可以始终通过self在班级中访问它们。 这很有用,因为在change_colors函数中,我可以循环浏览列表并通过.configure(bg=<color here>)更改按钮。
最后一点是.after 我在定义root之后立即在类构造函数外部调用它,然后在使用selfchange_colors函数内部调用它。 最终代码应每5秒钟随机更改按钮的颜色。

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM