gpt4 book ai didi

python - 可滚动框架未填满 Canvas

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:37 25 4
gpt4 key购买 nike

我使用 Python 2.7,并且有一个可滚动框架,其中 Canvas 不会缩小以适应我想要滚动的框架。

我查看了这个问题的答案,但当我运行它时它不起作用: How to resize a scrollable frame to fill the canvas?

当我打印 Canvas 内框架的宽度时,它显示为 0。

我还在我的计算机上运行了这个问题的答案中的代码: Scrollable Frame does not resize properly using tkinter in Python但它仍然会在标签左侧显示白色 Canvas ,并且删除标签时不会调整大小。

看起来像这样:

Canvas not resizing to fit scrollable frame

这是我的代码,基于这个问题的答案: Adding a scrollbar to a group of widgets in Tkinter

from Tkinter import *

class Scrollable_frame(Frame):

def __init__(self, parent, title, values):

self.parent = parent

Frame.__init__(self, self.parent)

self.canvas = Canvas(self, borderwidth=0, background="#ffffff")
self.scrollbar = Scrollbar(self, command=self.canvas.yview)
self.innerFrame = Radiobutton_frame(self.canvas,title,values)

self.canvas.configure(yscrollcommand=self.scrollbar.set)

self.canvas.grid(row=0, column=0, sticky= N+S)
self.scrollbar.grid(row=0, column=1, sticky = N+S)
self.canvas.create_window((0,0),window = self.innerFrame,anchor="nw")

self.innerFrame.bind("<Configure>", self.set_canvas_scrollregion)

self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)


def set_canvas_scrollregion(self, event):

width = event.width - 4
self.canvas.itemconfigure("self.innerFrame ", width=width)
self.canvas.config(scrollregion=self.canvas.bbox("all"))


class Radiobutton_frame(LabelFrame):

def __init__(self, parent, title, values):

"""
In: parent - Canvas
title - String
values - List of Int
"""

self.radiobuttons = {}
self.parent = parent

self.selection = StringVar()
self.selection.set("init")

LabelFrame.__init__(self, self.parent, text = title)

for value in values:
self.add_radiobutton(value)


def add_radiobutton(self, value):

"""
Adds a radiobutton to the frame.

In: item - String
"""

# Associate to same variable to make them function as a group
self.radiobuttons[value] = Radiobutton(master = self,
variable = self.selection,
text = value,
value = value)
self.radiobuttons[value].pack(anchor=W)

# Usage example

root = Tk()
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
scrollableFrame = Scrollable_frame(root, "Canvas not resizing", range(30))
scrollableFrame.grid(row=0, column=0, sticky=N+S+E+W)

if __name__ == '__main__':
root.mainloop()

最佳答案

我认为上述问题的代码片段不适合 a Minimal, Complete, and Verifiable example但至少它是可以运行的。

<小时/>

How to resize a scrollable frame to fill the canvas? 相比,您有三个错误

其中最重要的是,在链接的问题中,OP 使用了您不使用的选项 tags 。替换:

self.canvas.create_window((0,0),window = self.innerFrame,anchor="nw")

与:

self.canvas.create_window((0,0),window = self.innerFrame, anchor="nw", tags="my_tag")

另一个错误是您绑定(bind)了框架调整大小的事件,而不是实际 Canvas 的调整大小事件,Bryan's comment here 中也指出了这一点。 。替换:

self.innerFrame.bind("<Configure>", self.set_canvas_scrollregion)

与:

self.canvas.bind("<Configure>", self.set_canvas_scrollregion)

最后,tkinter 似乎不接受带有标签的空格字符,替换:

self.canvas.itemconfigure("self.innerFrame ", width=width)

与:

self.canvas.itemconfigure("my_tag", width=width)

最后,您应该:

from Tkinter import *

class Scrollable_frame(Frame):

def __init__(self, parent, title, values):

self.parent = parent

Frame.__init__(self, self.parent)

self.canvas = Canvas(self, borderwidth=0, background="#ffffff")
self.scrollbar = Scrollbar(self, command=self.canvas.yview)
self.innerFrame = Radiobutton_frame(self.canvas,title,values)

self.canvas.configure(yscrollcommand=self.scrollbar.set)

self.canvas.grid(row=0, column=0, sticky= N+S)
self.scrollbar.grid(row=0, column=1, sticky = N+S)
self.canvas.create_window((0,0),window = self.innerFrame,anchor="nw",
tags="my_tag")

self.canvas.bind("<Configure>", self.set_canvas_scrollregion)

self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)


def set_canvas_scrollregion(self, event):

width = event.width - 4
self.canvas.itemconfigure("my_tag", width=width)
self.canvas.config(scrollregion=self.canvas.bbox("all"))


class Radiobutton_frame(LabelFrame):

def __init__(self, parent, title, values):

"""
In: parent - Canvas
title - String
values - List of Int
"""

self.radiobuttons = {}
self.parent = parent

self.selection = StringVar()
self.selection.set("init")

LabelFrame.__init__(self, self.parent, text = title)

for value in values:
self.add_radiobutton(value)


def add_radiobutton(self, value):

"""
Adds a radiobutton to the frame.

In: item - String
"""

# Associate to same variable to make them function as a group
self.radiobuttons[value] = Radiobutton(master = self,
variable = self.selection,
text = value,
value = value)
self.radiobuttons[value].pack(anchor=W)

# Usage example

root = Tk()
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
scrollableFrame = Scrollable_frame(root, "Canvas not resizing", range(30))
scrollableFrame.grid(row=0, column=0, sticky=N+S+E+W)

if __name__ == '__main__':
root.mainloop()

关于python - 可滚动框架未填满 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48598382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com