Tôi có một menubutton, khi được nhấp vào sẽ hiển thị một trình đơn chứa chuỗi chuỗi cụ thể. Chính xác những gì chuỗi trong chuỗi đó, chúng tôi không biết cho đến khi thời gian chạy, do đó, trình đơn bật lên phải được tạo ra tại thời điểm đó. Dưới đây là những gì tôi có:Tự động tạo menu trong Tkinter. (biểu thức lambda?)
class para_frame(Frame):
def __init__(self, para=None, *args, **kwargs):
# ...
# menu button for adding tags that already exist in other para's
self.add_tag_mb = Menubutton(self, text='Add tags...')
# this menu needs to re-create itself every time it's clicked
self.add_tag_menu = Menu(self.add_tag_mb,
tearoff=0,
postcommand = self.build_add_tag_menu)
self.add_tag_mb['menu'] = self.add_tag_menu
# ...
def build_add_tag_menu(self):
self.add_tag_menu.delete(0, END) # clear whatever was in the menu before
all_tags = self.get_article().all_tags()
# we don't want the menu to include tags that already in this para
menu_tags = [tag for tag in all_tags if tag not in self.para.tags]
if menu_tags:
for tag in menu_tags:
def new_command():
self.add_tag(tag)
self.add_tag_menu.add_command(label = tag,
command = new_command)
else:
self.add_tag_menu.add_command(label = "<No tags>")
Phần quan trọng là nội dung trong "if menu_tags:" - Giả sử menu_tags là danh sách ['stack', 'over', 'flow']. Sau đó, những gì tôi muốn làm là một cách hiệu quả này:
self.add_tag_menu.add_command(label = 'stack', command = add_tag_stack)
self.add_tag_menu.add_command(label = 'over', command = add_tag_over)
self.add_tag_menu.add_command(label = 'flow', command = add_tag_flow)
nơi add_tag_stack() được định nghĩa là:
def add_tag_stack():
self.add_tag('stack')
và vân vân.
Vấn đề là, 'thẻ' biến mất trên giá trị 'ngăn xếp' và sau đó là giá trị 'quá' và cứ tiếp tục và nó không được đánh giá cho đến khi new_command được gọi, tại thời điểm đó thẻ biến 'chỉ là' dòng chảy '. Vì vậy, thẻ được thêm vào luôn là thẻ cuối cùng trên menu, bất kể người dùng nhấp vào gì.
Ban đầu tôi đã sử dụng lambda và tôi nghĩ có thể xác định rõ ràng chức năng như trên có thể hoạt động tốt hơn. Dù bằng cách nào vấn đề xảy ra. Tôi đã thử sử dụng một bản sao của biến 'tag' (hoặc với "current_tag = tag" hoặc sử dụng module sao chép) nhưng điều đó không giải quyết được. Tôi cung không chăc tại sao.
Tâm trí của tôi đang bắt đầu đi lang thang hướng tới những thứ như "eval" nhưng tôi hy vọng ai đó có thể nghĩ ra một cách thông minh không liên quan đến những điều kinh khủng như vậy.
Cảm ơn nhiều!
(Trong trường hợp nó có liên quan, Tkinter .__ version__ lợi nhuận '$ Xem xét lại: 67.083 $' và tôi đang sử dụng Python 2.6.1 trên Windows XP.)
Tôi nghĩ rằng có thể có một giải pháp cụ thể cho Tkinter. Có người nói "Không không không, cách bạn làm điều này là chức năng đặc biệt Tkinter.somethingOrOther()" Cảm ơn sự giúp đỡ! – MatrixFrog
Không sao cả! Tôi chỉ muốn chỉ ra rằng một bước đầu tiên tốt là cố gắng tách biệt một ví dụ nhỏ về vấn đề này, để xem đó có phải là vấn đề ngôn ngữ hay vấn đề về API hay không. –