2013-05-29 1 views
3

create_window 함수를 사용하여 창을 만들려면 Tkinter Canvas (self._canvas)을 사용하려고합니다. 해당 기능의 필드는 Tkinter Frame (self._tableFrame)입니다. 누군가 self._tableFrame을 자동으로 self._canvas의 크기로 확장하는 방법에 대해 나를 도울 수 있습니까? (사용자가 창 크기를 변경 한 후에도)?Tkinter Canvas create_window()

코드 : 당신은 이벤트 <Configure>self._canvas을 결합, 다음 프레임의 ID로 itemconfig를 호출 할 수 있습니다

from Tkinter import Scrollbar as tkScrollBar 
from Tkinter import Frame as tkFrame 
from Tkinter import Canvas as tkCanvas 
from Tkinter import Entry as tkEntry 
from Tkinter import StringVar as tkStringVar 
from Tkinter import Tk, HORIZONTAL, N, S, E, W, RIGHT, LEFT, BOTTOM, X, Y, BOTH 
from Tkinter import TOP 


class Widget(tkFrame): 
    def __init__(self, master=None): 
     tkFrame.__init__(self, master) 

     self._str = tkStringVar() 
     self._widget = tkEntry(self) 

     self._widget.config(textvariable=self._str, borderwidth=1, width=0) 
     self._widget.pack(expand=True, fill=X) 

    def settext(self, str_): 
     self._str.set(str_) 

    def gettext(self): 
     return self._str.get() 


class Application(tkFrame): 
    def __init__(self, rows, cols, master=None): 
     tkFrame.__init__(self, master) 

     yScroll = tkScrollBar(self) 
     xScroll = tkScrollBar(self, orient=HORIZONTAL) 

     self._canvas = tkCanvas(self, 
       yscrollcommand=yScroll.set, xscrollcommand=xScroll.set) 
     yScroll.config(command=self._canvas.yview) 
     xScroll.config(command=self._canvas.xview) 

     self._table  = [[0 for x in range(rows)] for x in range(cols)] 
     self._tableFrame = tkFrame(self._canvas) 

     for col in range(cols): 
      self._tableFrame.grid_columnconfigure(col, weight=1) 
      for row in range(rows): 
       self._table[row][col] = Widget(master=self._tableFrame) 
       self._table[row][col].settext("(%d, %d)" % (row, col)) 
       self._table[row][col].grid(row=row, column=col, sticky=E+W) 

     # For debugging 
     self._canvas.config(background="blue") 
     self._tableFrame.config(background="red") 

     yScroll.pack(side=RIGHT, fill=Y) 
     xScroll.pack(side=BOTTOM, fill=X) 

     self._canvas.create_window(0, 0, window=self._tableFrame, anchor=N+W) 
     self._canvas.pack(side=LEFT, fill=BOTH, expand=True) 


tkRoot = Tk() 

# Application Size and Center the Application 
appSize = (800, 600) 
w  = tkRoot.winfo_screenwidth() 
h  = tkRoot.winfo_screenheight() 

x = w/2 - appSize[0]/2 
y = h/2 - appSize[1]/2 
tkRoot.geometry("%dx%d+%d+%d" % (appSize + (x, y))) 
tkRoot.update_idletasks() # Force geometry update 

app = Application(5, 5, master=tkRoot) 
app.pack(side=TOP, fill=BOTH, expand=True) 
tkRoot.mainloop() 

답변

7

는 (직접하지 위젯에 대한 참조) 캔버스에 추가 :

def __init__(self, rows, cols, master=None): 
    # ... 
    self._frame_id = self._canvas.create_window(0, 0, window=self._tableFrame, anchor=N+W) 
    self._canvas.pack(side=LEFT, fill=BOTH, expand=True) 
    self._canvas.bind("<Configure>", self.resize_frame) 

def resize_frame(self, e): 
    self._canvas.itemconfig(self._frame_id, height=e.height, width=e.width) 

덧붙여서, 제 생각에 꽤 반복적이고 진술을 재 작성하는 것이 좋습니다. unpythonic :

import Tkinter as tk 
# Use tk.Tk, tk.Canvas, etc. 
관련 문제