我需要實現一個移動列表框。唯一相關的控件是向上和向下箭頭鍵。列表框應顯示列表中的行數(screen_rows),其中一行應該是高亮的(sel_row),並且如果用戶在第一個項目高亮顯示時向上箭頭或向下箭頭如果最後一個項目被突出顯示(即,如果用戶在第一個項目突出顯示時彈起,則應顯示最後一個項目並突出顯示)。向上箭頭突出顯示前一個項目,向下箭頭突出顯示下一個項目。實現一個列表框
我把東西放在一起,但我擔心我錯過了測試中的東西。考慮到列表框的普及,必須有一個標準的方法來做到這一點。
def up_key(self):
if self.sel_row > 0:
self.sel_row -= 1
elif self.top_item > 0: # top_item is the index of the first list item
self.top_item -= 1
elif self.top_item == 0:
if self.n_lines >= self.screen_rows: # n_lines is the number of items in the list
self.top_item = self.n_lines - self.screen_rows
self.sel_row = min(self.screen_rows-1, self.n_lines-1)
else:
self.top_item = 0
self.sel_row = self.n_lines-1
def down_key(self):
if self.sel_row < self.screen_rows-1 and self.sel_row < self.n_lines-1:
self.sel_row += 1
elif self.sel_row == self.screen_rows-1:
bottom_item = self.top_item + self.screen_rows
if bottom_item == self.n_lines:
self.top_item = 0
self.sel_row = 0
if bottom_item < self.n_lines:
self.top_item += 1
elif self.sel_row == self.n_lines-1:
self.top_item = 0
self.sel_row = 0
def set_pos(self, pos): # display item with index pos
if pos < 0:
pos = 0
elif pos >= self.n_lines:
pos = self.n_lines - 1
if pos < self.screen_rows:
self.top_item = 0
self.sel_row = pos
else:
self.sel_row = min(self.screen_rows, self.n_lines)//2 - 1
self.top_item = pos - self.sel_row
if self.top_item >= self.n_lines - self.screen_rows:
self.top_item = self.n_lines - self.screen_rows - 1
self.sel_row = pos - self.top_item - 1
編輯:每個功能後我所說的重繪屏幕功能,其重繪top_item屏幕的頂部和SEL-行突出顯示。
我已經添加了一個僞代碼標籤,以防某人在某些不是python的版本中有版本。
我曾經看到在gui編程的早年在c或C++中實現的列表框,但我找不到任何示例。無論如何,我會看看是否改變了你的建議,讓事情變得更簡單,並酌情返回 – foosion 2009-10-20 16:05:53
@foosion,是的,在GUI框架和小部件出現之前,有合理的功能,當編程到裸露的xlib或一個人寫了一個自己的小工具 - 在那裏,做了那個,但是,一個* LONG *前一陣子!) – 2009-10-21 02:11:33
@Alex,它只有20年左右的時間:-) – foosion 2009-10-21 11:15:11