Python,TK:在(可滚动的)画布内的一个框架中,除了y>;0x7fff
我在(可滚动的)画布(带有canvas.create_窗口)中使用一个框架将元素放入这个框架中(在我的实际应用程序中,这些是图像的缩略图) 当添加更多帧时,除了y>0x7fff(16位有符号整数的最高可能值)之外,将不再绘制任何内容 在Windows 10 1809和1909上使用Python 3.8.0 64位TK 8.6进行测试 请考虑下面的代码。当滚动到y=0x7fff下方时,该帧在那里,但为空。当最大化主窗口时,您会注意到,即使内部框架的边界也不再绘制 我的问题:这是已知的限制吗?还是我做错了什么?还是这是一只虫子?另外,如果它是一个bug,a不能说这个bug是在tkinter中还是在tk本身中 (注意:我意外地将主框架(ImgCollection)指定为内部_容器的主框架。当_画布指定为_容器的主框架时,行为会发生一些变化。但保持不变的是,绘图会在y>0x7fff处停止。)Python,TK:在(可滚动的)画布内的一个框架中,除了y>;0x7fff,python,tkinter,tk,Python,Tkinter,Tk,我在(可滚动的)画布(带有canvas.create_窗口)中使用一个框架将元素放入这个框架中(在我的实际应用程序中,这些是图像的缩略图) 当添加更多帧时,除了y>0x7fff(16位有符号整数的最高可能值)之外,将不再绘制任何内容 在Windows 10 1809和1909上使用Python 3.8.0 64位TK 8.6进行测试 请考虑下面的代码。当滚动到y=0x7fff下方时,该帧在那里,但为空。当最大化主窗口时,您会注意到,即使内部框架的边界也不再绘制 我的问题:这是已知的限制吗?还是我
将tkinter作为tk导入
从tkinter导入ttk
类ImgCollection(ttk.Frame):
定义初始化(self,*args,**kwargs):
super()
self.\u canvas=tk.canvas(self)
self.\u container=ttk.Frame(self)
sb=ttk.滚动条(自,方向=垂直),
command=self.\u canvas.yview)
self.\u canvas.config(yscrollcommand=sb.set)
self.\u canvas.pack(side=tk.LEFT,fill=tk.Y,expand=True)
sb包装(侧面=左侧,填充=右侧)
self.\u容器绑定(“”,self.\u onConfig)
self.\u canvas.create\u window((0,0),window=self.\u容器,
锚点=塔克西北)
def添加(自我):
框架=ttk.frame(自容器,边框宽度=2,浮雕=tk.SOLID)
canvas=tk.canvas(框架,宽度=500,高度=500)
canvas.create_line(0,0499499,width=8,fill='blue')
canvas.create_line(0499499,0,width=8,fill='blue')
canvas.pack()
frame.pack(side=tk.TOP,fill=tk.BOTH,expand=True)
def_onConfig(自身、事件):
打印(f'{event.height:x}')
self.\u canvas.configure(scrollregion=self.\u canvas.bbox(tk.ALL))
gui=tk.tk()
coll=ImgCollection(gui)
coll.pack(fill=tk.BOTH,expand=True)
对于范围(65)内的i:
coll.add()
gui.update()
gui.mainloop()
我的问题:这是已知的限制吗
是的,这是一个已知的限制。画布的可绘制区域不是无限的 已知的限制,来自Unix上的X Windows图形系统,Tcl/Tk最初是为该系统编写的。我猜这一限制是故意复制到其他平台上的,以避免程序在一个系统上似乎工作正常,但实际上根本不可移植的情况
import tkinter as tk
from tkinter import ttk
class ImgCollection(ttk.Frame):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._canvas = tk.Canvas(self)
self._container = ttk.Frame(self)
sb = ttk.Scrollbar(self, orient='vertical',
command=self._canvas.yview)
self._canvas.config(yscrollcommand=sb.set)
self._canvas.pack(side=tk.LEFT, fill=tk.Y, expand=True)
sb.pack(side=tk.LEFT, fill=tk.Y)
self._container.bind('<Configure>', self._onConfig)
self._canvas.create_window((0, 0), window=self._container,
anchor=tk.NW)
def add(self):
frame = ttk.Frame(self._container, borderwidth=2, relief=tk.SOLID)
canvas = tk.Canvas(frame, width=500, height=500)
canvas.create_line(0, 0, 499, 499, width=8, fill='blue')
canvas.create_line(0, 499, 499, 0, width=8, fill='blue')
canvas.pack()
frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
def _onConfig(self, event):
print(f'{event.height:x}')
self._canvas.configure(scrollregion=self._canvas.bbox(tk.ALL))
gui = tk.Tk()
coll = ImgCollection(gui)
coll.pack(fill=tk.BOTH, expand=True)
for i in range(65):
coll.add()
gui.update()
gui.mainloop()