【问题标题】:Horizontal scroll frame in canvas画布中的水平滚动框架
【发布时间】:2020-06-28 19:32:36
【问题描述】:

您好,我在画布上有一个框架。我想要一个按钮,每次按下按钮时都会向框架添加一个文本框。文本框被添加到它之前的文本框的右侧,一旦文本框太多,我希望能够使用滚动条来查看所有文本框。但由于某种原因,它不起作用。 提前感谢您的帮助。

代码如下:

from tkinter import *
import tkinter as tk  # python 3
from tkinter import ttk

class Tkinter(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (StartPage, SecondPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()
        frame.winfo_toplevel().geometry("1536x864")
        frame.configure(bg='#151B1E')

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.canvas = Canvas(self, height=400, bg='black', highlightthickness=0, )
        self.frame = tk.Frame(self.canvas)
        self.frame.configure(bg='#151B1E')
        self.frame.pack(fill='both', expand=True)
        self.frame.bind("<Configure>", self.onFrameConfigure)
        self.canvas.bind("<Configure>", self.onCanvasConfigure)
        self.canvas.create_window((0, 0), window=self.frame, width=1336, anchor='nw', tags='self.frame')
        self.canvas.place(x=20, y=200, relheight=0.7, relwidth=0.9674479167)

        self.editbutton = Button(self, text='Add', command=lambda: self.add())
        self.editbutton.pack()
        self.myscrollbar = Scrollbar(self, orient="horizontal", command=self.canvas.xview)
        self.myscrollbar.pack(side=BOTTOM, fill=X)

    def onFrameConfigure(self, event):
        '''Reset the scroll region to encompass the inner frame'''
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))

    def onCanvasConfigure(self, event):
        # width is tweaked to account for window borders
        width = event.width - 4
        self.canvas.itemconfigure("self.frame", width=width)

    def add(self):
        self.t = Text(self.frame, bg='#171D1F', fg='white', highlightcolor='#12171A', borderwidth=0, width=40)
        self.t.pack(side=tk.LEFT, padx=20)
        self.frame.update()  # update frame2 height so it's no longer 0 ( height is 0 when it has just been created )

        self.canvas.configure(xscrollcommand=self.myscrollbar.set, scrollregion="0 0 0 %s" % self.frame.winfo_width())

class SecondPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

app = Tkinter()
app.mainloop()

【问题讨论】:

  • 这是一个最小的复制示例,来自class StartPage(tk.Frame): 的所有代码都是相关的
  • 虽然来自StartPage 的代码是相关的,但与多个页面相关的所有代码都不相关。您可以直接将StartPage 放在根窗口中以简化示例。
  • 哦,我明白了,我会的

标签: python tkinter canvas scrollbar frame


【解决方案1】:

问题是您将内部框架的宽度强制为画布的宽度。画布中的框架用于滚动的原因是允许框架大于画布。需要去掉设置宽度的代码,或者只有在自然宽度小于画布宽度时才设置为画布宽度。

这是您将其强制为特定宽度的地方:

self.canvas.create_window(..., width=1336, ...)

...这里:

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

【讨论】:

  • 谢谢,我现在就试试!
  • 我注释掉了self.canvas.bind("&lt;Configure&gt;", self.onCanvasConfigure),但还是不行,框架卡住了
  • 我已更新我的答案以显示您设置宽度的位置。
  • 哦,我明白了,我会更新我的代码,然后回复你,谢谢
  • 我已经取消了限制,但是由于某种原因滚动条不起作用。
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2018-01-16
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
相关资源
最近更新 更多