Ширина списка Tkinter мешает полосам прокрутки

У меня проблема, когда у меня есть полоса прокрутки, отображающая несколько строк, каждая строка имеет ширину около 200 символов. Я установил ширину 125, чего было недостаточно. Однако, когда я нажимаю около 175, мои полосы прокрутки исчезают. Если у меня он равен 100 или меньше, он прокручивает все данные, но это очень маленькое окно. Я бы хотел, чтобы окно было размером с фрейм и пролистывало весь код. Код:


import Tkinter as tk
import tkFont
def view():
    data = ['|unique_id |     id |              species | sex_age |  collector |                          location |                  preparator | collection_date | entered_date | innitials |         notes', 
            '|       88 | A-1444 |      puffinus grseus |     n/a |        n/a |                               n/a |                         n/a |     13 May 2013 |  27 Apr 2017 |        EB | TL: 395mm WC:',
            '|       72 | A-1444 |      puffinus grseus |     n/a |        n/a |                               n/a |                         n/a |     13 May 2013 |  27 Apr 2017 |        EB | TL: 395mm WC:',
            '|       71 | A-1445 |        anas clypeata |       M |  G. Webber |                               n/a |                     A. Zack |     23 Oct 2013 |  26 Apr 2017 |        EB | TL: 395mm WC:',
            '|       87 | A-1445 |        anas clypeata |       M |  G. Webber |                               n/a |                     A. Zack |     23 Oct 2013 |  26 Apr 2017 |        EB | TL: 395mm WC:']
    size = [800, 600]
    obj_main_frame = tk.Tk()
    data_frame = tk.Frame(obj_main_frame, width=size[0], height=size[1])
    scrollbar_y = tk.Scrollbar(obj_main_frame, orient=tk.VERTICAL)
    scrollbar_x = tk.Scrollbar(obj_main_frame, orient=tk.HORIZONTAL)
    data_scrollable = tk.Listbox(data_frame, font=tkFont.Font(family="Courier", size=10), selectbackground="gray", selectmode=tk.SINGLE, width=150, yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)
    scrollbar_y.config(command=data_scrollable.yview)
    scrollbar_x.config(command=data_scrollable.xview)
    obj_main_frame.grid()
    data_frame.grid_propagate(0)
    data_frame.grid(row=0, column=0, sticky='nsew')
    scrollbar_x.grid(row=1, column=0, sticky='ew')
    scrollbar_y.grid(row=0, column=1, sticky='ns')
    data_scrollable.grid(row=0, column=0, sticky='nsew')
    for i, datum in enumerate(data):
        data_scrollable.insert(tk.END, datum)

    obj_main_frame.mainloop()
    return

if __name__ == '__main__':
    view()

person enbay1    schedule 26.04.2017    source источник


Ответы (1)


Вы сделали 2 ошибки в своем мировоззрении.

  • Во-первых, вы должны удалить аргумент width при определении вашего списка, чтобы он мог подстраиваться под размер своего родителя:

    data_scrollable = tk.Listbox(data_frame, 
                                 font=tkFont.Font(family="Courier", size=10),
                                 selectbackground="gray", selectmode=tk.SINGLE,
                                 yscrollcommand=scrollbar_y.set,
                                 xscrollcommand=scrollbar_x.set)
    
  • Во-вторых, после выравнивания списка в его фрейме, вы должны присвоить ненулевой вес соответствующей строке и столбцу, чтобы позволить списку расширяться:

    data_scrollable.grid(row=0, column=0, sticky='nsew')
    data_frame.columnconfigure(0, weight=1)
    data_frame.rowconfigure(0, weight=1)
    

См. документацию по Tkinter Grid Manager

person Josselin    schedule 26.04.2017