【问题标题】:Canvas not filling available space tkinter画布未填充可用空间 tkinter
【发布时间】:2020-02-06 20:37:36
【问题描述】:

我正在尝试使用 tkinter 作为 gui 界面制作一个消息传递程序。在 gui 的左侧,有一个画布,里面有数字 1 - 100。画布一侧还有一个滚动条,可以滚动浏览这些数字。

问题是画布不会填满所有可用空间,并且由于某种原因将自己限制在一个小盒子里。

代码:

from tkinter import *
# *** Scrollable Frame Class ***

class VerticalScrolledFrame(Frame):

    def __init__(self, parent, *args, **kw):
        Frame.__init__(self, parent, *args, **kw)

        vscrollbar = Scrollbar(self, orient=VERTICAL)
        vscrollbar.pack(fill=Y, side=LEFT, expand=FALSE)
        canvas = Canvas(self, bd=0, highlightthickness=0, yscrollcommand=vscrollbar.set, bg="black")
        canvas.pack(side=LEFT, fill=BOTH, expand=TRUE)
        vscrollbar.config(command=canvas.yview)

        canvas.xview_moveto(0)
        canvas.yview_moveto(0)

        self.interior = interior = Frame(canvas)
        interior_id = canvas.create_window(0, 0, window=interior,
                                           anchor=NW)
        def _on_mousewheel(event):
            canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")
            self.interior.bind_all("<MouseWheel>", _on_mousewheel)
            canvas.bind_all("<MouseWheel>", _on_mousewheel)

        def _configure_interior(event):
            size = (interior.winfo_reqwidth(), interior.winfo_reqheight())
            canvas.config(scrollregion="0 0 %s %s" % size)
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.config(width=interior.winfo_reqwidth())
        interior.bind('<Configure>', _configure_interior)

        def _configure_canvas(event):
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.itemconfigure(interior_id, width=canvas.winfo_width())
        canvas.bind('<Configure>', _configure_canvas)

        # *** Create Window ***
root = Tk()
root.geometry("800x545")
root.config(bg="#23272A")
#root.resizable(False, False)
root.title("Secure Message")

# *** Set Friends Frame ***
friends_frame = VerticalScrolledFrame(root)
friends_frame.pack(side=LEFT)

for i in range(100):
    friend_frames = []
    friend_frame = Frame(friends_frame.interior, width=100)
    friend_frames.append(friend_frame)
    friend_frames[-1].pack()
    text = Label(friend_frame, text=i)
    text.pack(side=LEFT)

chatSpace_frame = Frame(root)
chatSpace_frame.pack(side=RIGHT)

# *** GUI ***
chatSpace = Listbox(chatSpace_frame, bg="#2C2F33", fg="white", width = 65, height=29)
chatSpace.grid(row=0, column=1, sticky=E, padx=10)

user_input = Entry(chatSpace_frame, highlightbackground="#2C2F33", bg="grey", width = 64, fg="white")
user_input.grid(row=1, column=1, sticky=E, pady=10, padx=9)

user_input.focus()

root.mainloop()

如果有点难以理解,我很抱歉。任何帮助将不胜感激!

截图

左边有数字的画布需要填满聊天空间旁边的所有空白灰色空间。

【问题讨论】:

  • 您可能只需要在friends_frame.pack(side=LEFT) 行中添加填充/扩展选项。
  • 发布的代码有缩进错误。话虽如此,我认为问题不在于画布,而在于画布所在的框架。
  • @jasonharper 我已经尝试过了,不幸的是,它不起作用。
  • @BryanOakley 我相信缩进错误的发生是因为我将代码粘贴到堆栈溢出中,实际程序没有出现缩进错误。

标签: python python-3.x tkinter tkinter-canvas


【解决方案1】:

即使您没有发布运行的代码,但很明显问题不在于画布,而在于它所在的框架。

这是问题所在:

friends_frame.pack(side=LEFT)

friends_frame 没有展开,因此其中的画布无法展开。您需要在框架上设置expand 和/或fill 选项。

【讨论】:

  • friends_frame 不是 OP 认为的那样。
  • @stovfl:我不知道你的意思是什么,我不确定这是否重要。无论他们认为它是什么,它都不会填满分配给它的空间。
  • friends_frameCanvasScrollbar父级。因此它不是可滚动的Frame
  • @stovfl:我还是不明白你。他们不是在问画布内的框架,而是在问为什么画布没有增长。它没有增长,因为它的父级没有增长。
【解决方案2】:

问题是friends_frame 没有设置为同时填充 X 和 Y,并且需要将扩展​​设置为 true。

例子

# *** Set frame for friends view ***
friends_frame = VerticalScrolledFrame(root, bg="#23272A")
friends_frame.pack(side=LEFT, fill=BOTH, expand=TRUE)

【讨论】:

    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 2015-04-18
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多