Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,TK:在(可滚动的)画布内的一个框架中,除了y>;0x7fff_Python_Tkinter_Tk - Fatal编程技术网

Python,TK:在(可滚动的)画布内的一个框架中,除了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下方时,该帧在那里,但为空。当最大化主窗口时,您会注意到,即使内部框架的边界也不再绘制 我的问题:这是已知的限制吗?还是我

我在(可滚动的)画布(带有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处停止。)

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