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)
嗨,我在 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)