Tkinter resizablecanvas class 不会调整所有小部件的大小并且出现故障。 canvas 继续增长
Tkinter resizablecanvas class does not resize all the widgets and it is malfunctioning. The canvas keeps on growing
Tkinter resizablecanvas class 没有调整所有小部件的大小并且出现故障。 canvas 继续增长。 Canvas 的大小不断增加。我想要实现的是,当我最大化 window 时,我需要调整所有小部件的大小。我的代码如下
from tkinter import *
from tkinter import ttk
class ResizingCanvas(Canvas):
def __init__(self,parent,**kwargs):
Canvas.__init__(self,parent,**kwargs)
self.bind("<Configure>", self.resize)
self.height = self.winfo_reqheight()
self.width = self.winfo_reqwidth()
def resize(self,event):
wscale = float(event.width)/self.width
hscale = float(event.height)/self.height
self.width = event.width
self.height = event.height
self.config(width=self.width, height=self.height)
self.scale("all",0,0,wscale,hscale)
print (self.width, self.height)
class Test(Frame):
def Widgets(self):
self.tabcontrol = ttk.Notebook(self)
self.mainframe = Frame(self)
self.tabcontrol.add(self.mainframe, text = "TAB-1")
self.tabcontrol.pack(fill= "both", expand = YES)
self.canvasframe = Frame(self.mainframe)
self.canvasframe.grid(row=0, column = 0)
self.canvas = ResizingCanvas(self.canvasframe)
self.canvas.grid(row=0, column = 0)
self.widgetframe = Frame(self.canvasframe)
self.canvas.create_window(100,100, window = self.widgetframe)
self.LABEL = Label(self.widgetframe, text = "LABEL-1")
self.LABEL.grid(row=1, column= 1)
self.BUTTON = Button(self.widgetframe, text = "BUTTON-1")
self.BUTTON.grid(row=1, column= 2)
self.widgetframe.update_idletasks()
def __init__(self,initial):
super(Test, self).__init__(initial)
self.grid()
self.Widgets()
root = Tk()
Software = Test(root)
root.mainloop()
有人可以帮助我吗?谢谢!
如果我理解您的要求,您想要的是 canvas 填充 window,即使 window 调整大小时也是如此。如果您使用正确的 grid
、pack
或 place
选项,Tkinter 可以自动执行此操作。
您选择使用多层帧,并使用 grid
而不是 pack
,这让这变得非常困难。如果您只将一个小部件放入另一个小部件(根 [=38= 中的选项卡控件、canvas 框架中的 canvas 等),请使用 pack
而不是 grid
将需要更少的代码行。
以下代码说明了我将如何重写您的代码以消除一些额外的框架,并强制笔记本选项卡和 canvas 随根 window 自动增长。我还为 canvas 添加了一种颜色,以便更容易可视化。
注意在将 self
添加到根 window 以及将 canvas 添加到框架时使用 pack
而不是 grid
。如果愿意,您可以使用 grid
,但它还要求您将行和列配置为具有非零权重。这很容易做到,但是当您有如此简单的布局时,grid
需要三行代码,pack
需要一行代码。
from tkinter import *
from tkinter import ttk
class Test(Frame):
def Widgets(self):
self.tabcontrol = ttk.Notebook(self)
self.mainframe = Frame(self)
self.tabcontrol.add(self.mainframe, text = "TAB-1")
self.tabcontrol.pack(fill= "both", expand = YES)
self.canvas = Canvas(self.mainframe, background="bisque")
self.canvas.pack(fill="both", expand=True)
self.widgetframe = Frame(self.canvas)
self.canvas.create_window(100,100, window = self.widgetframe)
self.LABEL = Label(self.widgetframe, text = "LABEL-1")
self.LABEL.grid(row=1, column= 1)
self.BUTTON = Button(self.widgetframe, text = "BUTTON-1")
self.BUTTON.grid(row=1, column= 2)
def __init__(self,initial):
super(Test, self).__init__(initial)
self.pack(fill="both", expand=True)
self.Widgets()
root = Tk()
Software = Test(root)
root.mainloop()
Tkinter resizablecanvas class 没有调整所有小部件的大小并且出现故障。 canvas 继续增长。 Canvas 的大小不断增加。我想要实现的是,当我最大化 window 时,我需要调整所有小部件的大小。我的代码如下
from tkinter import *
from tkinter import ttk
class ResizingCanvas(Canvas):
def __init__(self,parent,**kwargs):
Canvas.__init__(self,parent,**kwargs)
self.bind("<Configure>", self.resize)
self.height = self.winfo_reqheight()
self.width = self.winfo_reqwidth()
def resize(self,event):
wscale = float(event.width)/self.width
hscale = float(event.height)/self.height
self.width = event.width
self.height = event.height
self.config(width=self.width, height=self.height)
self.scale("all",0,0,wscale,hscale)
print (self.width, self.height)
class Test(Frame):
def Widgets(self):
self.tabcontrol = ttk.Notebook(self)
self.mainframe = Frame(self)
self.tabcontrol.add(self.mainframe, text = "TAB-1")
self.tabcontrol.pack(fill= "both", expand = YES)
self.canvasframe = Frame(self.mainframe)
self.canvasframe.grid(row=0, column = 0)
self.canvas = ResizingCanvas(self.canvasframe)
self.canvas.grid(row=0, column = 0)
self.widgetframe = Frame(self.canvasframe)
self.canvas.create_window(100,100, window = self.widgetframe)
self.LABEL = Label(self.widgetframe, text = "LABEL-1")
self.LABEL.grid(row=1, column= 1)
self.BUTTON = Button(self.widgetframe, text = "BUTTON-1")
self.BUTTON.grid(row=1, column= 2)
self.widgetframe.update_idletasks()
def __init__(self,initial):
super(Test, self).__init__(initial)
self.grid()
self.Widgets()
root = Tk()
Software = Test(root)
root.mainloop()
有人可以帮助我吗?谢谢!
如果我理解您的要求,您想要的是 canvas 填充 window,即使 window 调整大小时也是如此。如果您使用正确的 grid
、pack
或 place
选项,Tkinter 可以自动执行此操作。
您选择使用多层帧,并使用 grid
而不是 pack
,这让这变得非常困难。如果您只将一个小部件放入另一个小部件(根 [=38= 中的选项卡控件、canvas 框架中的 canvas 等),请使用 pack
而不是 grid
将需要更少的代码行。
以下代码说明了我将如何重写您的代码以消除一些额外的框架,并强制笔记本选项卡和 canvas 随根 window 自动增长。我还为 canvas 添加了一种颜色,以便更容易可视化。
注意在将 self
添加到根 window 以及将 canvas 添加到框架时使用 pack
而不是 grid
。如果愿意,您可以使用 grid
,但它还要求您将行和列配置为具有非零权重。这很容易做到,但是当您有如此简单的布局时,grid
需要三行代码,pack
需要一行代码。
from tkinter import *
from tkinter import ttk
class Test(Frame):
def Widgets(self):
self.tabcontrol = ttk.Notebook(self)
self.mainframe = Frame(self)
self.tabcontrol.add(self.mainframe, text = "TAB-1")
self.tabcontrol.pack(fill= "both", expand = YES)
self.canvas = Canvas(self.mainframe, background="bisque")
self.canvas.pack(fill="both", expand=True)
self.widgetframe = Frame(self.canvas)
self.canvas.create_window(100,100, window = self.widgetframe)
self.LABEL = Label(self.widgetframe, text = "LABEL-1")
self.LABEL.grid(row=1, column= 1)
self.BUTTON = Button(self.widgetframe, text = "BUTTON-1")
self.BUTTON.grid(row=1, column= 2)
def __init__(self,initial):
super(Test, self).__init__(initial)
self.pack(fill="both", expand=True)
self.Widgets()
root = Tk()
Software = Test(root)
root.mainloop()