【发布时间】: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