Tkinter отображает длинный список в сетке - PullRequest
0 голосов
/ 06 января 2020

У меня огромный список l1 из почти 1074 имен приложений

['10 Best Foods for You' '104 找工作 - 找工作 找打工 找兼職 履歷健檢 履歷診療室' '11st' ...
 'Hotwire Hotel & Car Rental App' 'Housing-Real Estate & Property'
 'Houzz Interior Design Ideas'] 

Я хочу отобразить все приложения в одном окне, как показано ниже, но все они не видны. enter image description here

Я получаю следующую ошибку в консоли:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/Samit Patil/Desktop/PlaystoreStudy Project/test_gui.py", line 496, in <lambda>
    tk.Button(frame, text='Select query', width='15', font=("Open Sans", 13, 'bold'), bg='brown', fg='white',command=lambda c=i:query(c+1)).grid(row=i,column=1,sticky=W)
  File "C:/Users/Samit Patil/Desktop/PlaystoreStudy Project/test_gui.py", line 439, in query
    populate(frame)
  File "C:/Users/Samit Patil/Desktop/PlaystoreStudy Project/test_gui.py", line 418, in populate
    tk.Label(frame, text=l1[5], width='80',anchor=W,relief=GROOVE, height="4", font=("Calibri", 10, 'bold'), fg='black', bg='Green',wraplength=500).grid(row=i,column=0,sticky=W)
  File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py", line 2766, in __init__
    Widget.__init__(self, master, 'label', cnf, kw)
  File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py", line 2299, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: character U+1f602 is above the range (U+0000-U+FFFF) allowed by Tcl

Мой код:

        qy14apps = Toplevel(screen2)
        qy14apps.title("Select one app")
        adjustWindow(qy14apps) # configuring the window
        l1=list_apps()
        print (len(l1))
        def onFrameConfigure(canvas):

            canvas.configure(scrollregion=canvas.bbox("all"))

        def populate(frame):

            for i in range(len(l1)):
                tk.Label(frame, text=l1[i], width='80',anchor=W,relief=GROOVE, height="4", font=("Calibri", 10, 'bold'), fg='black', bg='Green',wraplength=500).grid(row=i,column=0,sticky=W)
                #l2=Label(text="\n", bg='white')
                #l2.grid(row=i+1,column=0)
                tk.Button(frame, text='Select app', width='15', font=("Open Sans", 13, 'bold'), bg='brown', fg='white',command="").grid(row=i,column=1,sticky=W)

        canvas = tk.Canvas(qy14apps, borderwidth=0, background="#ffffff")
        frame = tk.Frame(canvas, background="#ffffff")
        vsb = tk.Scrollbar(qy14apps, orient="vertical", command=canvas.yview)
        canvas.configure(yscrollcommand=vsb.set)

        vsb.pack(side="right", fill="y")
        canvas.pack(side="left", fill="both", expand=True)
        canvas.create_window((4,4), window=frame, anchor="nw")

        frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))
        populate(frame)

Я не понимаю, где я идет не так, потому что список слишком велик? Я применил ту же концепцию для списка из 20 элементов, и тогда это сработало. Любая помощь будет очень ценной. Спасибо.

1 Ответ

0 голосов
/ 06 января 2020

Я бы предпочел вставить этот объем данных в список и связать кнопку с функцией, которая извлекает выбранный элемент списка через переменную списка

listboxvariablename.curselection()

Чтобы удалить фигурные скобки, которые вы можете обойти каждый запись списка, l oop над списком, прежде чем вставить его в список и обратиться к записи по его индексу. Это удалит фигурные скобки при вставке записей в список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...