2016-01-06 98 views
6

我正在使用urwid,它是一個用於在ncurses中設計終端用戶界面的Python「框架」。有一件事,雖然我不能在詛咒中輕鬆實現urwid,但使光標不可見。就像現在這樣,選擇按鈕時光標是可見的,而且看起來很醜陋。有沒有辦法禁用它?Urwid:使光標不可見

回答

2

urwid使用curs_set函數,但不會將其作爲任何類的方法公開。有人可以修改urwid來允許使用這種方法;否則沒有可靠的方法來做到這一點。

您可能會將它報告爲issue

+1

我明白了。我在那裏發佈了一個問題,希望urwid devs會考慮這個問題。 – makos

+0

問題鏈接:https://github.com/urwid/urwid/issues/170 –

2

我同意在urwid.Button上閃爍的光標看起來有點跛腳,所以我想出了一個解決方案來隱藏它。在urwid中,Button類只是WidgetWrap的一個子類,其中包含SelectableIcon和兩個文本小部件(包含「<」和「>」)。這是SelectableIcon類,默認情況下,該類將光標位置設置爲標籤的第一個字符。通過繼承SelectableIcon,修改光標位置,然後將其包裝到urwid.WidgetWrap子類中,您可以創建自己的自定義按鈕,該按鈕可以執行內置的Button甚至更​​多的所有技巧。

這裏是它在我的項目中的樣子。

enter image description here

import urwid 

class ButtonLabel(urwid.SelectableIcon): 
    def __init__(self, text): 
     """ 
     Here's the trick: 
     we move the cursor out to the right of the label/text, so it doesn't show 
     """ 
     curs_pos = len(text) + 1 
     urwid.SelectableIcon.__init__(self, text, cursor_position=curs_pos) 

接下來,你可以用任何其它物品一起裹ButtonLabel對象爲WidgetWrap子類,這將是你的自定義按鈕。

class FixedButton(urwid.WidgetWrap): 
    _selectable = True 
    signals = ["click"] 
    def __init__(self, label): 
     self.label = ButtonLabel(label) 
     # you could combine the ButtonLabel object with other widgets here 
     display_widget = self.label 
     urwid.WidgetWrap.__init__(self, urwid.AttrMap(display_widget, None, focus_map="button_reversed")) 

    def keypress(self, size, key): 
     """ 
     catch all the keys you want to handle here 
     and emit the click signal along with any data 
     """ 
     pass 

    def set_label(self, new_label): 
     # we can set the label at run time, if necessary 
     self.label.set_text(str(new_label)) 

    def mouse_event(self, size, event, button, col, row, focus): 
     """ 
     handle any mouse events here 
     and emit the click signal along with any data 
     """ 
     pass 

在這段代碼,實際上是不是在FixedButtonWidgetWrap子控件的多組合,但你可以添加一個「[」和「]」的按鈕的邊緣,將它包裝成一個LineBox,等等。如果所有這些都是多餘的,您可以將事件處理函數移動到ButtonLabel類中,並使其在點擊時發出信號。

要逆轉時,其上的用戶移動,把它包裝成AttrMap並設置focus_map一些調色板項(「button_reversed」,在我的情況)按鈕。

0

隨着醉拳的答案的線條,而是用「微創手術」:

class ButtonLabel(urwid.SelectableIcon): 
    ''' 
    use Drunken Master's trick to move the cursor out of view 
    ''' 
    def set_text(self, label): 
     ''' 
     set_text is invoked by Button.set_label 
     ''' 
     self.__super.set_text(label) 
     self._cursor_position = len(label) + 1 


class MyButton(urwid.Button): 
    ''' 
    - override __init__ to use our ButtonLabel instead of urwid.SelectableIcon 

    - make button_left and button_right plain strings and variable width - 
     any string, including an empty string, can be set and displayed 

    - otherwise, we leave Button behaviour unchanged 
    ''' 
    button_left = "[" 
    button_right = "]" 

    def __init__(self, label, on_press=None, user_data=None): 
     self._label = ButtonLabel("") 
     cols = urwid.Columns([ 
      ('fixed', len(self.button_left), urwid.Text(self.button_left)), 
      self._label, 
      ('fixed', len(self.button_right), urwid.Text(self.button_right))], 
      dividechars=1) 
     super(urwid.Button, self).__init__(cols) 

     if on_press: 
      urwid.connect_signal(self, 'click', on_press, user_data) 

     self.set_label(label) 

在這裏,我們只能修改按鈕的外觀,但否則保留其行爲不變。

相關問題