python tkinter canvas_python – Tkinter Canvas create_window()

我正在尝试使用Tkinter Canvas(self._canvas)来使用create_window函数创建窗口.该函数的窗口字段是Tkinter Frame(self._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("", 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.

标签:python,python-2-7,tkinter,tkinter-canvas

来源: https://codeday.me/bug/20191005/1855840.html

你可能感兴趣的:(python,tkinter,canvas)