2012-04-20 10 views
5

तो मेरे पास टिंकर में कैनवास पर टेक्स्ट का एक गुच्छा है और मैं इसे टेक्स्ट बनाना चाहता हूं ताकि माउस टेक्स्ट पर होवर कर रहा हो। मेरे जीवन के लिए मैं यह नहीं समझ सकता कि इसे कैसे किया जाए, और वहां कहीं भी टिंकर के बारे में बहुत सारी जानकारी नहीं है।Tkinter के साथ पाठ पर होवर करते समय टेक्स्ट रंग बदलना?

for city in Cities: 
    CityText = Cities[i] 
    board.create_text(CityLocs[CityText][0], CityLocs[CityText][1], text=CityText, fill="white") 
    CityText = Cities[i] 
    i = i + 1 

यह सिर्फ मेरे कोड को कैनवास पर रखने के लिए है, हालांकि मुझे यकीन नहीं है कि मेरे बिंदु को पाने के लिए और क्या पोस्ट करना है। क्या कोई 'होवर' फ़ंक्शन या ऐसा कुछ नहीं है जो टिंकर में बनाया गया हो?

+1

आप शायद टैग जोड़ने और/या करने के लिए पाठ वस्तुओं आप ताकि आप उन्हें बाद –

उत्तर

3

यहाँ एक (वैसे) सुंदर लंगड़ा उदाहरण है कि ओएस एक्स पर काम करता है ...

from Tkinter import * 

master=Tk() 
canvas=Canvas(master) 
canvas.pack() 
canvas.create_text((20,20),activefill="red",text="Hello World!",fill="black") 
master.mainloop() 

संदर्भ: http://effbot.org/tkinterbook/canvas.htm

+0

बुरा नहीं पहुँच सकते हैं बना रहे आईडी संग्रहीत करना चाहते हैं, लेकिन केवल एक कैनवास ऑब्जेक्ट के अंदर पाठ तत्वों के लिए काम करेगा - आर्बिटरी विगेट्स बाहर एक कैनवास में 'भरें' या 'सक्रियफिल' विशेषता नहीं होती है। – jsbueno

+0

@jsbueno: बेशक, बाइंड अधिक आम तौर पर लागू होता है जैसा आपने इंगित किया है। (वह मेरा पहला विचार भी था ...), लेकिन उन्होंने कैनवास पर टेक्स्ट तत्वों के बारे में पूछा और यह मनमाने ढंग से घटनाओं को बाध्य करने से कहीं अधिक सरल है। साथ ही, क्या आप create_text विधि द्वारा उत्पन्न item_handles पर ईवेंट बाध्य कर सकते हैं? यदि नहीं, कर्सर के नीचे कौन सा टेक्स्ट तत्व नीचे ट्रैक करने का कार्य और भी कठिन हो जाता है। – mgilson

+2

हाँ आप कर सकते हैं, 'item = canvas.create_text (...); canvas.tag_bind (आइटम, "", कॉलबैक) '। इसके अलावा, जैसा कि जोएल की टिप्पणी द्वारा सुझाया गया है, आप सभी संबंधित आइटम 'create_text (..., टैग = "city_name") पर एक टैग जोड़ सकते हैं और इस टैग पर बाध्यकारी प्रदर्शन कर सकते हैं। – FabienAndre

2

आप मनमाने ढंग से घटनाओं (माउस, कीबोर्ड, विंडो प्रबंधक और संभवतः दूसरों बाध्य कर सकते हैं) Tkinter में किसी भी विजेट के लिए।

import Tkinter 
from functools import partial 

def color_config(widget, color, event): 
    widget.configure(foreground=color) 

parent = Tkinter.Tk() 
text = Tkinter.Label(parent, text="Hello Text") 
text.bind("<Enter>", partial(color_config, text, "red")) 
text.bind("<Leave>", partial(color_config, text, "blue")) 
text.pack() 

Tkinter.mainloop() 

functools.partial के उपयोग यहाँ आप फिर से उपयोग करने के लिए अनुमति देता है: जब पर माउस को हॉवर

उदाहरण के लिए, विगेट्स के रंग में परिवर्तन बाध्य करने के लिए -

उस के लिए एक अच्छा प्रलेखन http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm पर है आपके टेक्स्ट (लेबल) विजेट के लिए एक चर, क्योंकि आप उन्हें एक सूची में जोड़ रहे हैं। यदि कोई लैम्ब्डा का उपयोग करने के लिए बसने के लिए बस जाएगा, तो आपको एक घृणित आश्चर्य होगा, क्योंकि लैम्बडा फ़ंक्शन के शरीर में विजेट का संदर्भ देने वाला चर हमेशा for लूप के अंदर के अंतिम मान को इंगित करेगा। functools.partial उस समय परिवर्तनीय सामग्री को "फ्रीज" करें, जिसे एक बार कहा जाता है, और एक नया फ़ंक्शन उत्पन्न करता है।

हालांकि, चूंकि आप आइटम को कैनस में रख रहे हैं, इसलिए आप प्रत्येक आइटम के लिए "भरें" और "भरने योग्य" विशेषताओं को सेट कर सकते हैं, जैसे @ mgilson के उत्तर में, या आप एक अधिक सामान्य वर्ग नहीं बना सकते हैं केवल होवरिंग, लेकिन बाद में लागू करने के लिए चुनी जाने वाली अन्य घटनाएं।

यदि आपकी कक्षा में __call__ विधि है, तो आप कैनवास के bind विधि पर इसका एक उदाहरण पास कर सकते हैं, ताकि परिणामस्वरूप ऑब्जेक्ट को कैनवास पर प्रत्येक ईवेंट के लिए बुलाया जा सके। इस मामले में, माउस गति घटना पर्याप्त होता: (। ps कैनवास और पाठ नियुक्ति उदाहरण @ mgilson के जवाब से उधार)

from Tkinter import * 

class Follower(object): 
    def __init__(self,on_color="#fff", off_color="#000"): 
     self.on_color = on_color 
     self.off_color = off_color 
     self.previous_item = None 
    def hover(self, canvas, item, x, y): 
     x1, y1, x2, y2 = canvas.bbox(item) 
     if x1 <= x <= x2 and y1 <= y <= y2: 
      return True 
     return False 

    def __call__(self, event): 
     canvas = event.widget 
     item = canvas.find_closest(event.x, event.y) 
     hovering = self.hover(canvas, item, event.x, event.y) 
     if (not hovering or item != self.previous_item) and self.previous_item is not None: 
      canvas.itemconfig(self.previous_item, fill=self.off_color) 
     if hovering: 
      canvas.itemconfig(item, fill=self.on_color) 
     self.previous_item = item 

master=Tk() 
canvas=Canvas(master) 
canvas.pack() 
canvas.create_text((40,20),text="Hello World!",fill="black") 
canvas.create_text((60,80),text="FooBar",fill="black") 
canvas.bind("<Motion>", Follower()) 
master.mainloop() 

+0

यह एक अच्छा जवाब है यदि 'टेक्स्ट' या 'ग्रिड' ज्यामिति प्रबंधक आपके टेक्स्ट प्लेसमेंट के लिए पर्याप्त हैं ... मुझे लगता है कि 'place' ज्यामिति प्रबंधक भी इस्तेमाल किया जा सकता है ... लेकिन यह बदसूरत हो जाता है मुझे लगता है कि ... – mgilson

+0

@mgilson: वास्तव में - ओपी को वास्तव में कैनवास की जरूरत है - इस नए उदाहरण को इसे अधिक सामान्य तरीके से कवर करना चाहिए। (मैंने सोचा था कि एक अपराधी घटनाओं को कैनवास आइटम में बाँधती है, जब मैंने पहली बार जवाब लिखा था - आपको वास्तव में कुछ उदाहरण प्रबंधक को कक्षाओं जैसे दूसरे उदाहरण में दोबारा वितरित करने की आवश्यकता होगी) – jsbueno

+0

मैंने इसका परीक्षण नहीं किया, लेकिन यह बहुत ठोस लग रहा है। मेरा एक आरक्षण यह है कि ऐसा लगता है कि आपकी कक्षा * हमेशा * on_color के साथ रंगीन होने के लिए एक आइटम चुन लेगी (जब तक कर्सर कैनवास पर वैसे भी हो)। यह संभव है कि लेबल पर्याप्त स्पैस हैं कि ऐसे समय होंगे जब उनमें से कोई भी सक्रिय नहीं होगा (अगर कर्सर उदाहरण के लिए पर्याप्त न हो) - या अगर कर्सर छोड़ देता है (हालांकि यह शायद एक आसान फिक्स है , off_olem के रंग को off_color पर सेट करें और इसे किसी विधि में सेट करें जो "" से जुड़ा हुआ है)। – mgilson

1

यह पहले से ही Tkinter में बनाया गया है। जब आप अपना टेक्स्ट बनाते हैं तो यह निर्दिष्ट करने के लिए कि आप कौन सा रंग चाहते हैं, 'activefill' विकल्प का प्रयोग करें।

अधिक जानकारी के लिए निम्न लिंक देखें। Effbot.org/tkinterbook मेरी tkinter पर जाना है। http://effbot.org/tkinterbook/canvas.htm#Tkinter.Canvas.create_text-method

संबंधित मुद्दे