2016-02-13 2 views
0

Используя следующий пример кода, я написал, что у меня проблемы с каким-то поведением. Я хочу добавить/удалить полосу прокрутки по мере необходимости. Но когда я это делаю, он меняет все остальные элементы окна, когда изменяется окно. Это просто образец для демонстрации проблемы, вы увидите изменение размера окна при добавлении и удалении полосы прокрутки. В реальном приложении в окне больше виджетов.tkinter: authide scrollbar без изменения размера окна

Я пытаюсь сделать это правильно или если нет, то как я могу решить проблему? Я также планирую иметь второй виджет с полосами прокрутки, а также в другом отдельном фрейме.

from tkinter import * 
from tkinter import ttk 

class TopFrame(ttk.Frame): 
    def __init__(self, parent, col=0, row=0): 
     ttk.Frame.__init__(self, parent) 
     self.innerframe = ttk.Frame(parent) 

     self.list_scroll = ttk.Scrollbar(self.innerframe) 
     self.list_scroll.grid(column=1, row=0, sticky=NS) 
     self.list_scroll.grid_remove() 

     self.list = Listbox(self.innerframe, width=64, height=8, 
          yscrollcommand=self.list_scroll.set) 
     self.list_scroll.config(command=self.list.yview) 
     self.list.grid(column=0, row=0, sticky=NSEW) 

     self.innerframe.grid(column=col, row=row) 

     self.addbtn = ttk.Button(parent, text='add item', 
           command=self.additem) 
     self.addbtn.grid(column=col, row=row+1, padx=10, pady=2) 
     self.delbtn = ttk.Button(parent, text='del item', 
           command=self.delitem) 
     self.delbtn.grid(column=col, row=row+2, padx=10, pady=2) 

     self.grid_rowconfigure(0, weight=1) 
     self.grid_columnconfigure(0, weight=1) 

    def additem(self): 
     count = str(len(self.list.get(0, END))) 
     self.list.insert(END, 'demo' + count) 
     if len(self.list.get(0, END)) > 8: 
      self.list_scroll.grid() 

    def delitem(self): 
     self.list.delete(END) 
     if len(self.list.get(0, END)) <= 8: 
      self.list_scroll.grid_remove() 

class MasterFrame(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     topframe = TopFrame(self) 

if __name__ == '__main__': 
    MasterFrame().mainloop() 

ответ

0

После того, как окно было отображается в первый раз, вы можете получить размер окна, а затем использовать, чтобы вызвать метод geometry на корневом окне. Когда вы задаете размер окна с помощью команды geometry, она перестанет изменять размер, основываясь на изменениях своих внутренних виджетов.

Проще всего написать функцию, чтобы сделать это, и запланировать ее запуск с after_idle, который должен срабатывать после того, как окно впервые отображается.

0

Эта полоса прокрутки отключается, когда она не нужна. Таким образом, он просто выделяется и размер остается неизменным:

import tkinter as tk 

class AutoScrollbar(tk.Scrollbar): 
    def set(self, lo, hi): 
     if float(lo) <= 0.0 and float(hi) >= 1.0: 
      tk.Scrollbar.set(self, 0.0, 1.0) 
     else: 
      tk.Scrollbar.set(self, lo, hi) 
Смежные вопросы