मेरे पास एक ऐसा एप्लिकेशन है जो आपके कर्सर पर पिक्सेल का सीएसएस 3 रंग प्राप्त करता है, और मैं टेक्स्ट को छोटी विंडो में प्रदर्शित करने के लिए टिंकर का उपयोग करना चाहता हूं। मैं निम्नलिखित अपने कोड का टिंकर हिस्सा है:

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

जब भी मेरा कर्सर स्क्रीन पर चलता है तो यह लेबल टेक्स्ट को अपडेट करने के कार्य के बिना, जैसा मैं चाहता हूं, काम करता है। यह एप्लिकेशन लॉन्च करते समय एक बार काम करता है और लेबल टेक्स्ट वही रहता है। जब भी मेरा कर्सर चलता है तो मैं इसे कैसे बनाऊंगा ताकि लेबल टेक्स्ट अपडेट हो जाए? मैं अजगर 3.7 का उपयोग कर रहा हूँ

शुक्रिया

3
Logan 29 पद 2020, 05:31

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 = StringVar() असाइन कर सकते हैं और फिर var.set() इस पर।
  • मुझे यकीन नहीं है कि __name__='__main__' को while लूप में रखना एक अच्छा विकल्प है क्योंकि आप कार्य को समाप्त किए बिना विंडो को बंद नहीं कर पाएंगे, हर बार जब आप कोशिश करेंगे तो नया पॉप अप होगा ऐसा करने के लिए।
3
AST 29 पद 2020, 06:35

उत्तर\

मैंने .after कमांड को grabColor() फंक्शन में जोड़ा और cursorpixel और grabColor() फंक्शन को मिला दिया। मैंने रंग अपडेट करने के लिए .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()

स्रोत / अतिरिक्त संसाधन
मैं टिंकर का उपयोग करके स्वचालित रूप से अपडेट होने वाला GUI कैसे बनाऊं?< /ए>

3
DapperDuck 29 पद 2020, 06:43

आप समय-समय पर रंग पकड़ने के लिए 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()

ध्यान दें कि बाहरी मॉड्यूल पर निर्भरता कम करने के लिए pyautogui.position() के बजाय winfo_pointerxy() का उपयोग किया जाता है।

0
acw1668 29 पद 2020, 07:25