Восстановить выбранное значение из списка в Python tkinter - PullRequest
0 голосов
/ 03 февраля 2019

Использование python 3.7.2 Я хочу получить выбранную запись из Listbox.

Я играл с методами curselection(), selection_set() и get() и переставил ихмного раз.Я также пытался установить self.libo(selectmode="single")

import tkinter as tk


class Gui(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()  # ipadx=3, ipady=3
        self.createWidgets()
        self.createBindings()

    def widget_width(iterable):
        """returns a integer based on the longest entry contained in
        'iterable'. 'iterable' should be a data structure like list, dict or
        tuple."""
        length_counter = 0
        for entry in iterable:
            if len(entry) > length_counter:
                length_counter = len(entry)
        return length_counter

    def createWidgets(self):
        #   Listbox LabelFrame
        self.libo_lafr = tk.LabelFrame(root)
        self.libo_lafr.pack(side="top", padx=2, pady=2, ipadx=2, ipady=2)
        #   Listbox
        self.libo_entries = ("one", "two", "three", "four", "five", "six", "seven")
        self.libo = tk.Listbox(
            self.libo_lafr, width=Gui.widget_width(self.libo_entries),
            height=len(self.libo_entries), selectmode='browse',)
        self.libo.insert("end", *self.libo_entries)
        self.libo.pack()


        self.libo.curselection()
        print(self.libo)
        self.libo_selected = self.libo.selection_set(0)
        print(self.libo_selected)
        self.libo_selection = (self.libo.get(0))
    def createBindings(self):
        self.libo.bind("<<ListboxSelect>>", print(self.libo_selection))


root = tk.Tk()
audio_output_switcher = Gui(root)
audio_output_switcher.mainloop()

Я просто хочу выбранную запись из Listbox в виде строки.

В версии выше self.libo.curselection() печатает ".!labelframe.!listbox" (без "), я видел примеры кода, распаковывающие curselection()[0], и я также читал, что curselection() должен возвращать список, но если я пытаюсь распаковать его, я получаю IndexError.

self.libo.selection_set(0) печатает "None" (без ")

self.libo.get(0) печатает" один "(без"), self.libo.get(6) печатает "Seven". Так что get() работает как положено и позволяет мнеиндексы доступа 0-6 из Listbox записей.

Также примечательно, что я получаю только те печатные сообщения после закрытия графического интерфейса, я видел несколько видео на YouTube, где графический интерфейс tkinter будет выводиться на консольс открытым графическим интерфейсом в режиме реального времени.

Я подозреваю, что моя ошибка в функциях createWidgets() и createBidings() сделала двойной абзац перед строкой curselection().

1 Ответ

0 голосов
/ 03 февраля 2019

Мне кажется, что работает следующее:

def createWidgets(self):
    # Listbox LabelFrame
    self.libo_lafr = tk.LabelFrame(root)
    self.libo_lafr.pack(side="top", padx=2, pady=2, ipadx=2, ipady=2)

    # Listbox
    self.libo_entries = ("one", "two", "three", "four", "five", "six", "seven")
    self.libo = tk.Listbox(
        self.libo_lafr, width=Gui.widget_width(self.libo_entries), height=len(self.libo_entries),
        )
    self.libo.insert(tk.END, *self.libo_entries)
    self.libo.pack()

    self.libo.selection_set(0)
    self.libo_selection = self.libo_entries[int(self.libo.curselection()[0])]

    print(self.libo_selection)

curselection() возвращает кортеж целых чисел, хотя в некоторых версиях tkinter эти целые числа были представлены в виде строк, поэтому необходимость в int.Эти целые числа можно использовать для индексации данных, которые вы использовали для создания Listbox.Вам все еще нужно извлечь первый, даже если ваш режим выбора не допускает многократного.

self.libo.selection_set (0) печатает "Нет"

Thisкод:

self.libo_selected = self.libo.selection_set(0)
print(self.libo_selected)

должен напечатать None, поскольку selection_set() ничего не возвращает.

...