如何实时更新tkinter标签文本

2024-09-28 23:12:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序,可以获取光标所在像素的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

多谢各位


Tags: 文本import应用程序pilmaintkinterdefroot
3条回答

将变量赋给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()
  • 我已经从以pixel作为参数的cursorpixel()调用了grabColor()函数
  • 我已经使用了color_label.config()方法来更改标签中的文本,您也可以使用color_label['text']或者可能将textvariable{}分配给标签,然后在标签上使用var.set()
  • 我不确定将__name__='__main__'放入while循环是否是一个好的选择,因为如果不终止任务,您将无法关闭窗口,每次尝试这样做时都会弹出一个新窗口

回答

我将.after命令添加到grabColor()函数中,并组合了cursorpixelgrabColor()函数。我用.config来更新颜色。代码如下:

import pyautogui, PIL
from tkinter import *

root=Tk()
root.minsize(150, 50)
colortext = Label(root)
colortext.pack()

def grabColor():
    x,y = pyautogui.position()
    pixel = (x,y,x+1,y+1)
    img=PIL.ImageGrab.grab(bbox=pixel)
    color = img.getcolors()
    colortext.config(text=str(color))
    root.after(100, grabColor)

grabColor()

root.mainloop()

来源/其他资源
How do I create an automatically updating GUI using Tkinter?

您可以使用after()定期获取颜色:

import tkinter as tk
from PIL import ImageGrab

def grab_color(label):
    x, y = label.winfo_pointerxy()
    color = ImageGrab.grab((x, y, x+1, y+1)).getpixel((0, 0))
    label.config(text=str(color))
    label.after(100, grab_color, label)

def main():
    root = tk.Tk()
    color_label = tk.Label(root, width=20)
    color_label.pack(padx=10, pady=10)
    grab_color(color_label)
    root.mainloop()

if __name__ == "__main__":
    main()

注意winfo_pointerxy()被用来代替pyautogui.position()以减少对外部模块的依赖

相关问题 更多 >