2015-09-21 4 views
0

Специалисты Tkinter, мне трудно получить холст для прокрутки. Это мой второй графический интерфейс, и раньше я делал что-то подобное, поэтому не знаю, что я делаю неправильно. Я был бы признателен за любую помощь, которую вы можете предложить.Tkinter холст не прокручивается

Вот минимальная версия того, что я пытаюсь сделать. Я использую Python 3.4.3 на Windows, 10.

import tkinter as tk 
import tkinter.font as tk_font 
import tkinter.ttk as ttk 
import random 


def get_string_var(parent, value=''): 
    var = tk.StringVar(parent) 
    var.set(value) 
    return var 


class SummaryFrame(ttk.Frame): 
    def __init__(self, parent, **kwargs): 
     ttk.Frame.__init__(self, parent, **kwargs) 

     var_names = ['label_'+str(num) for num in range(1, 20)] 
     self.vars = {} 
     for name in var_names: 
      self.vars[name] = get_string_var(self) 

     self._add_summary_labels(self, self.vars, 1) 

    @staticmethod 
    def _add_summary_labels(frame, vars, start_row): 
     current_row = start_row 
     for name in vars: 
      tk.Label(frame, text=name, anchor=tk.N+tk.W).grid(row=current_row, column=0, sticky=tk.N+tk.S+tk.W+tk.E) 
      text_label = tk.Label(frame, wraplength=200, textvariable=vars[name], anchor=tk.N+tk.W, justify=tk.LEFT) 
      text_label.grid(row=current_row, column=1, sticky=tk.W) 
      current_row += 1 

    def set_summary_fields(self, info): 
     for name in info: 
      if name in self.vars: 
       self.vars[name].set(info[name]) 


class OuterFrame(ttk.Frame): 
    def __init__(self, parent, **kwargs): 
     ttk.Frame.__init__(self, parent, **kwargs) 

     self.canvas = tk.Canvas(self) 
     scrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL, command=self.canvas.yview) 
     self.canvas.configure(yscrollcommand=scrollbar.set) 
     self.summary = SummaryFrame(self.canvas) 
     self.summary.pack(fill=tk.BOTH, expand=1) 
     self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1) 
     scrollbar.pack(side=tk.LEFT, fill=tk.Y, expand=1) 

     label_text = {} 
     for i in range(1, 20): 
      label_text['label_'+str(i)] = "information " * random.randint(1, 20) 
     self.set_fields(label_text) 

    def set_fields(self, info): 
     self.summary.set_summary_fields(info) 
     self.canvas.configure(scrollregion=(1, 1, self.summary.winfo_width(), self.summary.winfo_height())) 


if __name__ == "__main__": 
    root = tk.Tk() 
    frame = OuterFrame(root) 
    frame.pack(fill=tk.BOTH, expand=1) 
    root.mainloop() 

The скроллинга должно измениться, когда содержимое внутренней SummaryFrame расширяется, но не делает. Он остается серым и не работает. Что я делаю не так?

ответ

0

Короткий ответ: вы настраиваете область прокрутки на один пиксель на один пиксель.

Вы настраиваете scrollregion на основе ширины и высоты self.summary, но вы делаете это до того, как окно будет отображаться на экране. Поэтому ширина и высота одинаковы.

Перед вычислением ширины и высоты окна вам нужно подождать, пока окно будет нарисовано.

+0

Спасибо. Ваш ответ заставил меня указывать в правильном направлении. Я забыл называть self.canvas.create_window, поэтому итоговый кадр никогда не отображался на холсте. Между этим и привязкой к «» на холсте он работает сейчас. –

Смежные вопросы