Python Tkinter 画布 create_window()
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16820520/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Tkinter Canvas create_window()
提问by markfw
I'm trying to use Tkinter Canvas(self._canvas) to create window using create_windowfunction. The windowfield for that function is a Tkinter Frame(self._tableFrame). Can someone please help me out on how to make self._tableFrameto expand to size of self._canvasautomatically (Even after the window size changed by user)?
我正在尝试使用Tkinter Canvas( self._canvas) 使用create_window函数创建窗口。该函数的窗口字段是Tkinter Frame( self._tableFrame)。有人可以帮助我解决如何自动self._tableFrame扩展到大小self._canvas吗(即使在用户更改窗口大小之后)?
Code:
代码:
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()
采纳答案by A. Rodas
You can bind self._canvaswith the event <Configure>, and then call itemconfigwith the id of the frame added to the canvas (not directly the reference to the widget):
您可以self._canvas与 event绑定<Configure>,然后itemconfig使用添加到画布的框架的 id调用(而不是直接对小部件的引用):
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)
By the way, I recommend you to rewrite your importstatements, which in my opinion are quite repetitive and unpythonic:
顺便说一句,我建议您重写您的import陈述,在我看来,这些陈述非常重复且不符合 Python 风格:
import Tkinter as tk
# Use tk.Tk, tk.Canvas, etc.

