簡體   English   中英

Tkinter Canvas create_window()

[英]Tkinter Canvas create_window()

我正在嘗試使用Tkinter Canvasself._canvas )來使用create_window函數創建窗口。 該函數的窗口字段是Tkinter Frameself._tableFrame )。 有人可以請幫我如何使self._tableFrame擴大到規模self._canvas自動(即使在用戶改變窗口大小)?

碼:

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()

您可以將self._canvas與事件<Configure>綁定,然后使用添加到畫布的幀的id調用itemconfig (而不是直接對窗口小部件的引用):

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)

順便說一句,我建議你重寫你的import語句,在我看來這是非常重復和unpythonic

import Tkinter as tk
# Use tk.Tk, tk.Canvas, etc.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM