首页 > 解决方案 > 如何实时更新 tkinter 标签文本

问题描述

我有一个应用程序可以获取光标所在像素的 css3 颜色,我想使用 tkinter 在一个小窗口中显示文本。我关注的是我的代码的 tkinter 部分:

import pyautogui, PIL
import tkinter as tk

def cursorpixel():
    x,y = pyautogui.position()
    pixel = (x,y,x+1,y+1)
    return pixel

def grabColor(square, max_colors=256):
    img=PIL.ImageGrab.grab(square)
    color = img.getcolors(max_colors)
    return color

def main():
    root=tk.Tk()
    root.minsize(150, 50)
    color = tk.Label(root,
                     text= grabColor(cursorpixel()),
                     fg = "black",
                     font = "Arial").pack()
    root.mainloop()

while __name__ == "__main__":
    main()

这可以按我的意愿工作,而没有在我的光标在屏幕上移动时更新标签文本的功能。它在启动应用程序时工作一次,并且标签文本保持不变。我将如何做到这一点,以便每当我的光标移动时标签文本都会更新?我正在使用 python 3.7

谢谢

标签: pythonpython-3.xtkinter

解决方案


将变量分配给text参数并没有帮助,因为即使变量的值发生变化,它也不会反映在标签中。这是我的方法(这只是许多可能的方法之一)

import pyautogui, PIL
import tkinter as tk
from threading import Thread

def cursorpixel():
    x,y = pyautogui.position()
    pixel = (x,y,x+1,y+1)
    grabColor(pixel)

def grabColor(square, max_colors=256):
    global color_label,root
    img=PIL.ImageGrab.grab(square)
    color = img.getcolors(max_colors)
    color_label.config(text=color)

def refresh():
    while True:
        cursorpixel()

def main():
    global color_label,root
    root=tk.Tk()
    root.minsize(150, 50)
    color_label = tk.Label(root,
                     fg = "black",
                     font = "Arial")
    color_label.pack()
    Thread(target=refresh).start()
    root.mainloop()

if __name__ == "__main__":
    main()

笔记

  • 我改用了多线程并创建了一个在无限循环refresh()中触发的函数。cursorpixel()
  • 我已经调用了作为参数的grabColor()函数。cursorpixel()pixel
  • 我已经使用该color_label.config()方法更改标签中的文本,您也可以使用color_label['text']或分配textvariable var = StringVar()给标签然后使用var.set()它。
  • 我不确定将其置于循环中是否是一个好选择,__name__='__main__'因为while您将无法在不终止任务的情况下关闭窗口,每次尝试这样做时都会弹出新窗口。

推荐阅读