Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 3.x 如何调整画布可滚动小部件的大小?_Python 3.x_Tkinter - Fatal编程技术网

Python 3.x 如何调整画布可滚动小部件的大小?

Python 3.x 如何调整画布可滚动小部件的大小?,python-3.x,tkinter,Python 3.x,Tkinter,这个想法是,当我调整可滚动画布的大小时,它和它的文本小部件会增长或填充整个根/顶级 如果我在框架上工作,我可以这样做,但是对于可滚动的框架,您需要创建一个画布小部件并使其可滚动。现在我不知道问题是画布还是画布上插入的小部件 import tkinter as tk from tkinter import ttk class ScrollableFrame(): def __init__(self, container, *args, **kwargs): self.co

这个想法是,当我调整可滚动画布的大小时,它和它的文本小部件会增长或填充整个根/顶级

如果我在框架上工作,我可以这样做,但是对于可滚动的框架,您需要创建一个画布小部件并使其可滚动。现在我不知道问题是画布还是画布上插入的小部件

import tkinter as tk
from tkinter import ttk

class ScrollableFrame():
    def __init__(self, container, *args, **kwargs):
        self.container = container
        self.canvas = tk.Canvas(self.container, bg="green")
        self.scrollbar = ttk.Scrollbar(self.container, orient="horizontal", command=self.canvas.xview)
        self.scrollable_frame = tk.Frame(self.canvas)
        self.scrollable_frame.grid(sticky="wesn")
        self.scrollable_frame.bind("<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))

        self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
        self.canvas.configure(xscrollcommand=self.scrollbar.set)
        
        self.canvas.grid(row=0, column=0, sticky="wesn")
        self.scrollbar.grid(row=1, column=0, sticky="wesn")
        
if __name__ == "__main__":
    root = tk.Tk()
    root.configure(bg="grey20")
    
    s = ScrollableFrame(root)
    
    t = tk.Text(s.scrollable_frame)
    t.grid(row=0, column=0, sticky="wesn")
    
    t2 = tk.Text(s.scrollable_frame)
    t2.grid(row=0, column=1, sticky="wesn")

    root.mainloop()
    
将tkinter作为tk导入
从tkinter导入ttk
类ScrollableFrame():
定义初始化(self,container,*args,**kwargs):
self.container=容器
self.canvas=tk.canvas(self.container,bg=“绿色”)
self.scrollbar=ttk.scrollbar(self.container,orient=“horizontal”,command=self.canvas.xview)
self.scrollable_frame=tk.frame(self.canvas)
self.scrollable_frame.grid(sticky=“wesn”)
self.scrollable\u frame.bind(“,lambda e:self.canvas.configure(scrollregion=self.canvas.bbox(“全部”))
self.canvas.create_window((0,0),window=self.scrollable_frame,anchor=“nw”)
configure(xscrollcommand=self.scrollbar.set)
self.canvas.grid(行=0,列=0,sticky=“wesn”)
self.scrollbar.grid(行=1,列=0,sticky=“wesn”)
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
root.configure(bg=“grey20”)
s=可滚动框架(根)
t=tk.Text(s.scrollable_框架)
t、 网格(行=0,列=0,sticky=“wesn”)
t2=tk.文本(s.可滚动的_框架)
t2.网格(行=0,列=1,sticky=“wesn”)
root.mainloop()

我很高兴得到帮助

根据评论中的要求,在调整根窗口的大小时,您希望增大/缩小两个文本框。以下是经过修改的代码,以及实现该代码所需的更改:

import tkinter as tk
from tkinter import ttk

class ScrollableFrame():
    def __init__(self, container, *args, **kwargs):
        self.container = container
        self.canvas = tk.Canvas(self.container, bg="green")
        self.scrollbar = ttk.Scrollbar(self.container, orient="horizontal", command=self.canvas.xview)
        self.scrollable_frame = tk.Frame(self.canvas)
        self.scrollable_frame.grid(sticky="wesn")
        self.scrollable_frame.bind("<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))

        self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw", tags="scrollable")
        self.canvas.configure(xscrollcommand=self.scrollbar.set)

        self.canvas.grid(row=0, column=0, sticky="wesn")
        self.scrollbar.grid(row=1, column=0, sticky="we") # fill horizontally only

        # make self.canvas to fill all the available space of container
        container.rowconfigure(0, weight=1)
        container.columnconfigure(0, weight=1)

        # resize self.scrollable_frame when self.canvas is resized
        self.canvas.bind("<Configure>", lambda e: self.canvas.itemconfig("scrollable", width=e.width, height=e.height))

if __name__ == "__main__":
    root = tk.Tk()
    root.configure(bg="grey20")

    s = ScrollableFrame(root)

    # make the two text boxes to fill all the space of s.scrollable_frame
    s.scrollable_frame.rowconfigure(0, weight=1)
    s.scrollable_frame.columnconfigure((0,1), weight=1)

    t = tk.Text(s.scrollable_frame)
    t.grid(row=0, column=0, sticky="wesn")

    t2 = tk.Text(s.scrollable_frame)
    t2.grid(row=0, column=1, sticky="wesn")

    root.mainloop()
将tkinter作为tk导入
从tkinter导入ttk
类ScrollableFrame():
定义初始化(self,container,*args,**kwargs):
self.container=容器
self.canvas=tk.canvas(self.container,bg=“绿色”)
self.scrollbar=ttk.scrollbar(self.container,orient=“horizontal”,command=self.canvas.xview)
self.scrollable_frame=tk.frame(self.canvas)
self.scrollable_frame.grid(sticky=“wesn”)
self.scrollable\u frame.bind(“,lambda e:self.canvas.configure(scrollregion=self.canvas.bbox(“全部”))
self.canvas.create_window((0,0),window=self.scrollable_frame,anchor=“nw”,tags=“scrollable”)
configure(xscrollcommand=self.scrollbar.set)
self.canvas.grid(行=0,列=0,sticky=“wesn”)
self.scrollbar.grid(行=1,列=0,sticky=“we”)#仅水平填充
#使self.canvas填满容器的所有可用空间
container.rowconfigure(0,权重=1)
container.columnconfigure(0,权重=1)
#调整self.canvas的大小时调整self.scrollable_框架的大小
self.canvas.bind(“,lambda e:self.canvas.itemconfig(“可滚动”,宽度=e.width,高度=e.height))
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
root.configure(bg=“grey20”)
s=可滚动框架(根)
#使两个文本框填满s.scrollable_框架的所有空间
s、 可滚动的_frame.rowconfigure(0,权重=1)
s、 可滚动的_frame.columnconfigure((0,1),权重=1)
t=tk.Text(s.scrollable_框架)
t、 网格(行=0,列=0,sticky=“wesn”)
t2=tk.文本(s.可滚动的_框架)
t2.网格(行=0,列=1,sticky=“wesn”)
root.mainloop()

所以基本上逻辑是当根窗口调整大小时,画布调整大小以填充根窗口。然后调整画布内的框架(
可滚动框架
)的大小以填充画布,最后调整两个文本小部件的大小以填充
可滚动框架

是否意味着调整根窗口的大小时,画布和滚动条不会增长以填充根窗口?@acw1668是,还有画布内的文本小部件。滚动条用于滚动画布以查看文本小部件,所以为什么需要增大/缩小文本小部件?滚动条不是问题。我的问题是“为什么需要增大/缩小文本小部件”?谢谢你,这对我有帮助。我没有添加“s.scrollable_frame.columnconfigure((0,1),weight=1)”这句话,当然现在它有意义了。很抱歉给你添麻烦了