मेरे पास एक ऐसा एप्लिकेशन है जो आपके कर्सर पर पिक्सेल का सीएसएस 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 जवाब
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
लूप में रखना एक अच्छा विकल्प है क्योंकि आप कार्य को समाप्त किए बिना विंडो को बंद नहीं कर पाएंगे, हर बार जब आप कोशिश करेंगे तो नया पॉप अप होगा ऐसा करने के लिए।
उत्तर\
मैंने .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 कैसे बनाऊं?< /ए>
आप समय-समय पर रंग पकड़ने के लिए 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()
का उपयोग किया जाता है।
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।