Helpex - Trao đổi & giúp đỡ Đăng nhập
9

Tôi muốn tự động chọn mục đầu tiên trong hộp danh sách. Bằng cách chọn mục đầu tiên, ý tôi không chỉ đơn giản là mặc định cho mục đầu tiên hoặc đặt tiêu điểm vào nó. Tôi đã đạt được điều đó bằng cách làm self.listbox.select_set(0). Tôi muốn mục mặc định cũng được chọn . Nói cách khác, khi tôi chạy mã bên dưới, tôi muốn print(value)in giá trị của lựa chọn mặc định. Nếu Châu Á được chọn từ menu tùy chọn, thì Nhật Bản sẽ tự động in ra bảng điều khiển. Nếu châu Phi, Nigeria nên in và Đức cho châu Âu.

Bất kỳ gợi ý nào về cách tôi có thể đạt được điều này? Cảm ơn.

from tkinter import *
from tkinter import ttk
import tkinter.messagebox

class App:
    def __init__(self):
        self.master = Tk()
        self.di = {'Asia': ['Japan', 'China', 'Malaysia', 'India', 'Korea',
                            'Vietnam', 'Laos', 'Thailand', 'Singapore',
                            'Indonesia', 'Taiwan'],
                     'Europe': ['Germany', 'France', 'Switzerland'],
                     'Africa': ['Nigeria', 'Kenya', 'Ethiopia', 'Ghana',
                                'Congo', 'Senegal', 'Guinea', 'Mali', 'Cameroun',
                                'Benin', 'Tanzania', 'South Africa', 'Zimbabwe']}
        self.variable_a = StringVar()
        self.frame_optionmenu = ttk.Frame(self.master)
        self.frame_optionmenu.pack()
        options = sorted(self.di.keys())
        self.optionmenu = ttk.OptionMenu(self.frame_optionmenu, self.variable_a, options[0], *options)

        self.variable_a.set('Asia')
        self.optionmenu.pack()
        self.btn = ttk.Button(self.master, text="Submit", width=8, command=self.submit)
        self.btn.pack()

        self.frame_listbox = ttk.Frame(self.master)

        self.frame_listbox.pack(side=RIGHT, fill=Y)
        self.scrollbar = Scrollbar(self.frame_listbox )
        self.scrollbar.pack(side=RIGHT, fill=Y)
        self.listbox = Listbox(self.frame_listbox, selectmode=SINGLE, yscrollcommand=self.scrollbar.set)
        self.variable_a.trace('w', self.updateoptions)

        self.scrollbar.config(command=self.listbox.yview)
        self.listbox.pack()

        #Populate listbox
        for each in self.di[self.variable_a.get()]:
            self.listbox.insert(END, each)
            self.listbox.select_set(0) #This only sets focus on the first item.
        self.listbox.bind("<<ListboxSelect>>", self.OnSelect)

        self.master.mainloop()

    def updateoptions(self, *args):
        #countries = self.di[self.variable_a.get()]
        self.listbox.delete(0, 'end')
        for each in self.di[self.variable_a.get()]:
            self.listbox.insert(END, each)
            self.listbox.select_set(0) #This only sets focus on the first item.
        self.listbox.pack()

    def submit(self, *args):
        var = self.variable_a.get()
        if messagebox.askokcancel("Selection", "Confirm selection: " + var):
            print(var)

    def OnSelect(self, event):
        widget = event.widget
        value = widget.get(widget.curselection()[0])
        print(value)

App()

Chạy Python 3.4.1

9 hữu ích 0 bình luận 24k xem chia sẻ
21

Giải pháp đơn giản nhất là tạo <<ListboxSelect>>sự kiện cùng lúc mà bạn thay đổi lựa chọn:

def updateoptions(self, *args):
    ...
    self.listbox.select_set(0) #This only sets focus on the first item.
    self.listbox.event_generate("<<ListboxSelect>>")
    ...
21 hữu ích 2 bình luận chia sẻ
3
# add before .mainloop()
self.listbox.selection_set( first = 0 )

EDIT#1 2014-08-21 13:50 [UTC+0000]

Tkinter.Listbox()-es có hành vi MVC-Model-Part khá phức tạp. Do đó, Phần điều khiển của nó .methods()phức tạp hơn một chút để xử lý.

Các Listbox()mặc định select-modechỉ cho phép một mục duy nhất được lựa chọn, nhưng select-modelập luận ủng hộ bốn cài đặt: SINGLE, BROWSE, MULTIPLE, và EXTENDED(mặc định là BROWSE). Trong số này, hai chế độ đầu tiên là chế độ lựa chọn đơn và hai chế độ cuối cùng cho phép chọn nhiều mục.

Các chế độ này khác nhau theo những cách tinh tế.

Ví dụ, BROWSEgiống như SINGLE, nhưng nó cũng cho phép kéo vùng chọn .

Nhấp vào một mục ở MULTIPLEchế độ sẽ chuyển trạng thái của nó mà không ảnh hưởng đến các mục đã chọn khác.

EXTENDEDchế độ này cho phép nhiều lựa chọn và hoạt động giống như GUI trình khám phá tệp của Windows — bạn chọn một mục với một đơn giản click, nhiều mục với một tổ hợp và phạm vi mục có - -s.Ctrl-clickShiftclick

Nhiều lựa chọn có thể được lập trình bằng mã loại này:

listbox = Listbox( aWindow, bg = 'white', font = ( 'courier', fontsz ) )
listbox.config( selectmode = EXTENDED )                         # see above
listbox.bind( '<Double-1>', ( lambda event: onDoubleClick() ) ) # a lambda-wrapped CallBackHANDLER()
# onDoubleClick: get messages selected in listbox               # not listed here
selections = listbox.curselection()                             # tuple of digit-string(s), aTupleOfSTRINGs, where digit-string(s) range from { 0, 1, .., N-1 }
selections = [ int( x ) + 1 for x in selections ]               # transform string(s) to shifted int(s), make 'em { 1, 2, .., N }

Khi kích hoạt nhiều lựa chọn, .curselection()phương thức trả về danh sách các chuỗi chữ số cung cấp số lượng tương đối của các mục được chọn hoặc nó trả về một bộ giá trị trống nếu không có mục nào được chọn.

Hãy lưu ý rằng phương pháp này luôn trả về một bộ chuỗi chữ số, ngay cả trong chế độ lựa chọn duy nhất.

Do đó, về mặt đối xứng, Listbox().selection_set()phương thức phải giàu tính năng để có thể định cấu hình tất cả các trạng thái có thể có cho giá trị của < aSelectionSET >.

QED ở trên trong bài đăng đầu tiên.

3 hữu ích 4 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python python-3.x listbox tkinter optionmenu , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading