2014-11-16 12 views
5

मैं ttkcalendar.py पाया जा सकता है का उपयोग कर रहा in this link.ttk.Treeview - नहीं बदली जा सकती पंक्ति की ऊँचाई

मैं Python 3.3

में इस्तेमाल के लिए यह अनुकूल नहीं बनाया है मूल रूप से मुझे क्या करना कोशिश कर रहा हूँ दर्ज है यह कैलेंडर विजेट मेरे टिंकर एप्लिकेशन में है, जो ठीक काम करता है और वहां कोई समस्या नहीं है।

समस्याओं मैं दूर करने के लिए इच्छा कर रहे हैं:

  1. मैं कैलेंडर की (माह, दिन & तिथियां) फ़ॉन्ट आकार कैसे बदल सकता हूँ - पूरे
  2. मैं कैसे चयनित तिथि इतना बदल सकता हूँ यह bold चला जाता है। - पूर्ण
  3. treeview में पंक्तियों की ऊंचाई कैसे बदल सकता है क्योंकि प्रीवोयस प्रयासों में फ़ॉन्ट आकार बढ़ाया जा सकता है लेकिन पंक्ति की ऊंचाई फ़ॉन्ट आकार के साथ नहीं बढ़ती है। - अभी भी मदद की प्रतीक्षा

अग्रिम धन्यवाद।

संपादित करें 1:

पूरे कार्यक्रम के लिए नीचे दिए गए कोड खोजें:

import calendar 
import tkinter as Tkinter 
import tkinter.font as tkFont 
from tkinter import ttk        #Imports ttk Module 

def get_calendar(locale, fwday): 
    #Instantiate Proper Calendar Class 
    if locale is None: 
     return calendar.TextCalendar(fwday) 
    else: 
     return calendar.LocaleTextCalendar(fwday, locale) 

class Calendar(ttk.Frame): 
    datetime = calendar.datetime.datetime 
    timedelta = calendar.datetime.timedelta 

    def __init__(self, master=None, **kw): 
     """ 
     WIDGET-SPECIFIC OPTIONS 

      locale, firstweekday, year, month, selectbackground, 
      selectforeground 
     """ 
     #Remove Custom Options From kw BEFORE Initializating ttk.Frame 
     fwday = kw.pop('firstweekday', calendar.MONDAY) 
     year = kw.pop('year', self.datetime.now().year) 
     month = kw.pop('month', self.datetime.now().month) 
     locale = kw.pop('locale', None) 
     sel_bg = kw.pop('selectbackground', '#EEEEEE') 
     sel_fg = kw.pop('selectforeground', '#B6333B') 

     self._date = self.datetime(year, month, 1) 
     self._selection = None       #No Date Selected 

     ttk.Frame.__init__(self, master, **kw) 

     self._cal = get_calendar(locale, fwday) 

     self.__setup_styles()       #Creates Custom Styles 
     self.__place_widgets()       #Pack/Grid Used Widgets 
     self.__config_calendar()      #Adjust Calendar Columns & Setup Tags 
     #Configure a Canvas & Proper Bindings for Selecting Dates 
     self.__setup_selection(sel_bg, sel_fg) 

     #Store Item ids - Used for Insertion Later On 
     self._items = [self._calendar.insert('', 'end', values='') 
          for _ in range(6)] 
     #Insert Dates in the Currently Empty Calendar 
     self._build_calendar() 

     #Set Minimal Size for Widget 
     self._calendar.bind('<Map>', self.__minsize) 

    def __setitem__(self, item, value): 
     if item in ('year', 'month'): 
      raise AttributeError("attribute '%s' is not writeable" % item) 
     elif item == 'selectbackground': 
      self._canvas['background'] = value 
     elif item == 'selectforeground': 
      self._canvas.itemconfigure(self._canvas.text, item=value) 
     else: 
      ttk.Frame.__setitem__(self, item, value) 

    def __getitem__(self, item): 
     if item in ('year', 'month'): 
      return getattr(self._date, item) 
     elif item == 'selectbackground': 
      return self._canvas['background'] 
     elif item == 'selectforeground': 
      return self._canvas.itemcget(self._canvas.text, 'fill') 
     else: 
      r = ttk.tclobjs_to_py({item: ttk.Frame.__getitem__(self, item)}) 
      return r[item] 

    def __setup_styles(self): 
     #CUSTOM ttk Styles 
     style = ttk.Style(self.master) 
     arrow_layout = lambda dir: (
      [('Button.focus', {'children': [('Button.%sarrow' % dir, None)]})] 
     ) 
     style.layout('L.TButton', arrow_layout('left')) 
     style.layout('R.TButton', arrow_layout('right')) 

    def __place_widgets(self): 
     #Header Frame & Widgets 
     hframe = ttk.Frame(self) 
     lbtn = ttk.Button(hframe, style='L.TButton', command=self._prev_month) 
     rbtn = ttk.Button(hframe, style='R.TButton', command=self._next_month) 
     self._header = ttk.Label(hframe, width=15, anchor='center', font='Arial 20') 
     #Main Calendar 
     self._calendar = ttk.Treeview(show='', selectmode='none', height='6') 
     #Pack The Widgets 
     hframe.pack(in_=self, side='top', pady=4, anchor='center') 
     lbtn.grid(in_=hframe) 
     self._header.grid(in_=hframe, column=1, row=0, padx=12) 
     rbtn.grid(in_=hframe, column=2, row=0) 
     self._calendar.pack(in_=self, expand=1, fill='both', side='bottom') 

    def __config_calendar(self): 
     cols = self._cal.formatweekheader(3).split() 
     self._calendar['columns'] = cols 
     self._calendar.tag_configure('header', background='grey90', font='Arial 20') 
     self._calendar.insert('', 'end', values=cols, tag=('header', 'dayFont')) 
     #Change Font of dayFont TAG 
     self._calendar.tag_configure('dayFont', font='Arial 20') 
     #Adjust Column Widths 
     font = tkFont.Font(size=20) 
     maxwidth = max(font.measure(col) for col in cols) 
     for col in cols: 
      self._calendar.column(col, width=maxwidth, minwidth=maxwidth, anchor='c') 

    def __setup_selection(self, sel_bg, sel_fg): 
     self._font = tkFont.Font() 
     canvas = Tkinter.Canvas(self._calendar, background=sel_bg, borderwidth=0, highlightthickness=0) 
     self._canvas = canvas 
     canvas.text = canvas.create_text(0, 0, fill=sel_fg, anchor='c') 

     canvas.bind('<ButtonPress-1>', lambda evt: canvas.place_forget()) 
     self._calendar.bind('<Configure>', lambda evt: canvas.place_forget()) 
     self._calendar.bind('<ButtonPress-1>', self._pressed) 

    def __minsize(self, evt): 
     width, height = self._calendar.master.geometry().split('x') 
     height = height[:height.index('+')] 
     self._calendar.master.minsize(width, height) 

    def _build_calendar(self): 
     year, month = self._date.year, self._date.month 

     #Update Header Text (Month, YEAR) 
     header = self._cal.formatmonthname(year, month, 0) 
     self._header['text'] = header.title() 

     #Update Calendar Showing Dates 
     cal = self._cal.monthdayscalendar(year, month) 

     for indx, item in enumerate(self._items): 
      week = cal[indx] if indx < len(cal) else [] 
      fmt_week = [('%02d' % day) if day else '' for day in week] 
      self._calendar.item(item, values=fmt_week, tag='bodyFont') 
      self._calendar.tag_configure('bodyFont', font='Arial 10')   


    def _show_selection(self, text, bbox): #SELECTION FONT 
     """Configure canvas for a new selection.""" 
     x, y, width, height = bbox 

     textw = self._font.measure(text) 

     canvas = self._canvas 
     canvas.configure(width=width, height=height) 
     canvas.coords(canvas.text, width - textw, height/2 - 1) 
     canvas.itemconfigure(canvas.text, text=text, font='Arial 15 bold') 
     canvas.place(in_=self._calendar, x=x, y=y) 

    #Callbacks 

    def _pressed(self, evt): 
     """Clicked somewhere in the calendar.""" 
     x, y, widget = evt.x, evt.y, evt.widget 
     item = widget.identify_row(y) 
     column = widget.identify_column(x) 

     if not column or not item in self._items:  #Clicked in the Weekdays Row or Just Outside The Columns 
      return 

     item_values = widget.item(item)['values'] 
     if not len(item_values):      #Row is Empty For This Month 
      return 

     text = item_values[int(column[1]) - 1] 
     if not text:         #Date is Empty 
      return 

     bbox = widget.bbox(item, column) 
     if not bbox:         #Calendar is not Visible Yet 
      return 

     #Update & Then Show Selection 
     text = '%02d' % text 
     self._selection = (text, item, column) 
     self._show_selection(text, bbox) 

    def _prev_month(self): 
     """Updated calendar to show the previous month.""" 
     self._canvas.place_forget() 

     self._date = self._date - self.timedelta(days=1) 
     self._date = self.datetime(self._date.year, self._date.month, 1) 
     #Reconstruct Calendar 
     self._build_calendar() 

    def _next_month(self): 
     """Update calendar to show the next month.""" 
     self._canvas.place_forget() 

     year, month = self._date.year, self._date.month 
     self._date = self._date + self.timedelta(
      days=calendar.monthrange(year, month)[1] + 1) 
     self._date = self.datetime(self._date.year, self._date.month, 1) 

     self._build_calendar() 

    #Properties 
    #----------------------------------------------------- 

    @property 
    def selection(self): 
     """Return a datetime representing the current selected date.""" 
     if not self._selection: 
      return None 

     year, month = self._date.year, self._date.month 
     return self.datetime(year, month, int(self._selection[0])) 

#---------------------------------- 

संपादित करें 2:

मैं Treeview की relief कैसे बदल सकता हूँ?

उत्तर

9

शायद आपको पसंद है, मुझे उम्मीद है कि लाइनों को आवश्यकतानुसार विस्तारित किया जाएगा। लेकिन मैंने नीचे दिए गए कोड के साथ समस्या की पुष्टि की, समाधान (दो स्टाइल लाइन) छोड़े गए। जब मुझे समाधान here और संबंधित स्टाइल पेज नहीं मिला, तो मैंने googled और this पाया। Emiliano के जवाब पर नीचे स्क्रॉल करें, और निम्न में से कुछ (एक इंडेंट विकल्प भी है)।

import tkinter as tk 
from tkinter import ttk 

root = tk.Tk() 
root.geometry('500x200') 
style = ttk.Style(root) 
style.configure('Treeview', rowheight=40) #SOLUTION 
tree = ttk.Treeview(root) 
tree.insert('', 0, text='Line 1 of many XXX', tags='T') 
tree.insert('', 1, text='Line 2 of many XXX', tags='T') 
tree.insert('', 2, text='Line 3 of many XXX', tags='T') 
tree.column('#0', stretch=True) 
tree.tag_configure('T', font='Arial 20') 
tree.pack(fill='x') 

ऊपर दिए गए उत्तर के साथ, ऊपर दिए गए उत्तर के साथ, समस्या को प्रदर्शित करने वाले न्यूनतम कोड का एक उदाहरण है। यह पोस्ट करने के लिए चीज की तरह है!

संपादित करें 1:

कैलेंडर विजेट ठीक से आयात योग्य और एक अन्य आवेदन में प्रयोग करने योग्य बनाने के लिए, यह एक कस्टम शैली उपयोग करती हैं इसलिए अपनी शैली अनुप्रयोग में किसी अन्य treeviews को प्रभावित नहीं करता चाहिए।

style.configure('Calendar.Treeview', rowheight=40) 
tree = ttk.Treeview(root, style='Calendar.Treeview') 

संपादित करें 2:

मैं सिर्फ टीटीके शैलियों के बारे में अपने आप सीख रहा हूँ। आपके राहत प्रश्न का उत्तर देने के लिए, मैं इस style doc पर गया और संपादन 1 में दो संशोधनों के साथ उपर्युक्त चलाने के बाद आइडल शैल में निम्नलिखित की कोशिश की।

>>> style.layout('Calendar.Treeview') 
[('Treeview.field', {'sticky': 'nswe', 'children': [('Treeview.padding', 
{'sticky': 'nswe', 'children': [('Treeview.treearea', {'sticky': 'nswe'})]})], 'border': '1'})] 
>>> style.element_options('Calendar.Treeview.border') 
('-relief',) 
>>> style.lookup('Calendar.Treeview.border', 'relief') 
'' 
>>> style.configure('Calendar.Treeview.border', relief='raised') 
{} 

मुझे कोई सीमा नहीं दिखाई देती है और न ही सेटिंग का कोई प्रभाव नहीं दिखता है। शायद कॉलम के बीच सीमाओं पर राहत लागू होती है। मुझे नहीं पता। (ध्यान दें कि बदलते rowheight तुरंत उपलब्ध है, तो विन्यास 'जी' है।)

+0

धन्यवाद टेरी! बिना किसी लाभ के इसे समझने के लिए घंटों बिताए हैं। मेरे पास जोड़ने के लिए एक छोटा सा प्रश्न है: मैं ट्रीव्यूव की राहत कैसे बदल सकता हूं? क्या यह संभव है? – MistUnleashed

+0

उपरोक्त 2 संपादित करें देखें। –

+0

महान उत्तर, महान लोग। –

0

मैं कैसे treeview में पंक्तियों की ऊंचाई को बदल सकते हैं के रूप में prevoius का प्रयास फ़ॉन्ट आकार बढ़ाया जा सकता है लेकिन पंक्ति की ऊँचाई नहीं है फ़ॉन्ट आकार के साथ वृद्धि। - अभी भी प्रतीक्षारत मदद

मामले तुम अब भी इस पर मदद इंतजार कर रहे हैं, वहाँ एक way पंक्ति की ऊँचाई बदलने के लिए, है कि हालांकि गूगल समूहों धागा कहना है कि यह आधिकारिक तौर पर टी द्वारा समर्थित नहीं है:

#apply any configuration options 
ttk.Style().configure('Treeview',rowheight=30) 
3

मैंने पाया Tkinter फ़ॉन्ट वस्तु एक मैट्रिक्स() विधि, कि "linespace" के रूप में अपनी ऊंचाई देता है। यही कारण है कि पंक्ति की ऊँचाई गतिशील रूप से बढ़ाया जा करने के लिए अनुमति देता है:

try: 
    from tkinter.font import Font 
    from tkinter.ttk import Style, Treeview 
    from tkinter import *   
except: 
    from tkFont import Font 
    font ttk import Style, Treeview 
    from Tkinter import * 

font=Font(family='Arial', size=20) 
font.metrics() 
#output: {'ascent': 31, 'descent': 7, 'linespace': 38, 'fixed': 0} 
इसी के साथ

, आप के साथ फ़ॉन्ट ऊंचाई प्राप्त कर सकते हैं:

: तो फिर अपने Treeview विजेट में rowheight स्थापित करने के लिए इसका इस्तेमाल करते हैं

font.metrics()['linespace'] 
#output: 38 

fontheight=font.metrics()['linespace'] 

style=Style() 
style.configure('Calendar.Treeview', font=font, rowheight=fontheight) 

tree=Treeview(style='Calendar.Treeview') 

फ़ॉन्ट ऑब्जेक्ट पैरामीटर को बदलने से ट्रीव्यू विजेट को आसानी से अपडेट किया जाता है, लेकिन पंक्तिबद्धता अद्यतन नहीं होती है, और इसे फिर से करने की आवश्यकता होती है। उदाहरण के लिए तो, एक कीबोर्ड शॉर्टकट के साथ फ़ॉन्ट आकार स्केलिंग कुछ ऐसा दिखाई देगा:

def scaleup(): 
    font['size']+=1 
    style.configure('Calendar.Treeview', rowheight=font.metrics()['linespace']) 

def scaledown(): 
    font['size']-=1 
    style.configure('Calendar.Treeview', rowheight=font.metrics()['linespace']) 

tree.bind('<Control-equal>', scaleup) 
tree.bind('<Control-minus>', scaledown) 

मैं वास्तव में नियंत्रण-माउसव्हील से भी ऐसा ही चाहते थे, लेकिन अभी तक यह पता लगाने व्यवहार नहीं किया था (करने के लिए खुशी होगी सुनें कि यह कैसे काम करता है)।

आशा है कि यह आसान हो जाएगा।

+0

अद्भुत !! वास्तव में मुझे क्या चाहिए। – Riyaz

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