canvas 中的水平滚动框

Horizontal scroll frame in canvas

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

代码如下:

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()

问题是您强制将内框的宽度设置为 canvas 的宽度。 frame-in-a-canvas 用于滚动的原因是因为 frame 允许大于 canvas。您需要删除设置宽度的代码,或者如果其自然宽度小于 canvas.

的宽度,则仅将其设置为 canvas 的宽度

这是您将其强制为特定宽度的位置:

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

...这里:

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