码迷,mamicode.com
首页 > 编程语言 > 详细

python gui之tkinter语法杂记

时间:2014-12-18 10:10:59      阅读:629      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   ar   io   color   os   sp   

随手写的,后续整理。

1. Entry如何调用父类的__init__?

    以下错,原因后续分析

super(Your_Entry_Class, self).__init__(self,**kw)

  报错:TypeError: must be type, not instance 。 莫名其妙

   谷歌了下,解决方案如下

apply(Entry.__init__, (self, parent), **kw)

 

2. 如何将ttk treeview 的某一行转入编辑状态

   事实上,(python 3)treeview有一个readonly属性。但我用的是python 2。

   解决方案:在双击treeview时根据鼠标的位置定位单元格,然后在此单元格里面贴入一个Entry控件即可。引用自stackoverflow

 

    def on_detail_bom_line_db_click(self, event):
        ‘‘‘ Executed, when a row is double-clicked. Opens
        read-only EntryPopup above the item‘s column, so it is possible
        to select text ‘‘‘

        # close previous popups
        if self.entryPopup:
            self.entryPopup.destroy()

        # what row and column was clicked on

        rowid = self.bom_lines.identify_row(event.y)
        column = self.bom_lines.identify_column(event.x)

        # clicked row parent id
        parent = self.bom_lines.parent(rowid)
        #print ‘parent:‘+parent
        # do nothing if item is top-level
        if parent == ‘‘:
            pass

        # get column position info
        x,y,width,height = self.bom_lines.bbox(rowid, column)

        # y-axis offset
        pady = height // 2

        # place Entry popup properly
        url = self.bom_lines.item(rowid, text)

        self.entryPopup = StickyEntry(self.bom_lines, url, width=12)
        self.entryPopup.place( x=x, y=y+pady, anchor=W)

扩展了Entry,添加了一点点行为:

class StickyEntry(Entry):

    def __init__(self, parent, text, **kw):
        ‘‘‘ If relwidth is set, then width is ignored ‘‘‘
        #fa = super(self,StickyEntry)
        #fa.__init__(parent, **kw)
        apply(Entry.__init__, (self, parent), kw)

        self.insert(0, text)
        #self[‘state‘] = ‘readonly‘
        self[‘readonlybackground‘] = ‘white‘
        self[‘selectbackground‘] = ‘#1BA1E2‘
        self[‘exportselection‘] = False

        self.focus_force()
        self.bind("<Control-a>", self.selectAll)
        self.bind("<Escape>", lambda *ignore: self.destroy())

    def selectAll(self, *ignore):
        ‘‘‘ Set selection on the whole text ‘‘‘
        self.selection_range(0, ‘end‘)

        # returns ‘break‘ to interrupt default key-bindings
        return ‘break‘

 

3. treeview 的 heigth属性咋回事?

   比如设置为60(pixels),结果抛出屏幕很多。 原因是这个是行数!!!

4. Entry 的width似乎也不是像素为单位的!

   随便设置一个数字,比如20,能有200pixel或者更多的效果。

   经过验证,似乎是数字字符的个数(比如20,就刚好能放20个数字字符!)

   具体以什么字符为基准未知!

5.如何给ttk treeview设置竖直滚动条?

   添加一个Srollbar控件,并将其set函数丢给treeview的yscrollcommand进行绑定。

   注意布局,Scrollbar控件最好紧挨着treeview,并且在右边。

  

vbar = ttk.ScrollBar(container, orient=VERTICAL, command = your_treeview.yview)
your_treeview.configure(yscrollcomand=vbar.set)
your_treeview.grid(row=0)
vbar.grid(row=0, column=1,sticky=NS)

 6. 如何将ttk treeview中的内容清空?

调用其delete方法,如下:

items = your_treeview.get_children()
[your_treeview.delete(item) for item in items]

 7. 如何得到ttk treeview被双击的单元格的值?

  理论上讲,只通过控件是无解的。通过自己定义坐标边界的方式来解决,即给每一列定义宽度(像素单位)。event.x/y能够取到坐标。在分析此坐标落在哪一列的坐标范围内即可分析出。

header_widths=[n1,n2,n3....]
row_selected = your_treeview.identify_row(event.y)
values = your_treeview.item(row_selected,‘values)
cell_val = False
index = -1
t=event.x
for i in range(header_widths):
    if t>0:
        t=t-self.form_bom_line_widths[i]
    else:
        index=i-1
        break
if index!=-1:
    cell_val = values[index]

  

python gui之tkinter语法杂记

标签:des   style   blog   http   ar   io   color   os   sp   

原文地址:http://www.cnblogs.com/Tommy-Yu/p/4171006.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!