python/tkinter滚动按钮

python/tkinter滚动按钮,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我有一个python脚本,它创建了一个窗口,显示带有垂直滚动条的数字网格。我遇到的问题是滚动不平稳。有没有办法克服这个问题?一个测试示例是: import tkinter as tk class list_window(tk.Toplevel): def __init__(self, title, *args, **kwargs): tk.Toplevel.__init__(self, None, *args, **kwargs) self.title(title)

我有一个python脚本,它创建了一个窗口,显示带有垂直滚动条的数字网格。我遇到的问题是滚动不平稳。有没有办法克服这个问题?一个测试示例是:

import tkinter as tk

class list_window(tk.Toplevel):

  def __init__(self, title, *args, **kwargs):
    tk.Toplevel.__init__(self, None, *args, **kwargs)
    self.title(title)

    self.geometry('1500x600')

    self.outer_frame=tk.Frame(self)

    canvas=tk.Canvas(self.outer_frame)
    self.list_frame=tk.Frame(canvas)
    scrollbar = tk.Scrollbar (self.outer_frame,orient="vertical",command=canvas.yview)
    canvas.configure(yscrollcommand=scrollbar.set, yscrollincrement=10)

    def scrollhelper(event):
      canvas.configure(scrollregion=canvas.bbox("all"))
    self.list_frame.bind("<Configure>",scrollhelper)

    self.outer_frame.pack(side="top",fill="both",expand=1)
    scrollbar.pack(side="right",fill="y")
    canvas.pack(side="left",fill="both",expand=1)
    canvas.create_window((0,0),window=self.list_frame,anchor='nw')

    #Fill with a bunch of widgets, for example
    import random
    for i in range(1000):
      for j in range(10):
        tk.Label(self.list_frame, text=str(random.random())).grid(row=i, column=j)

def spawn_list_window():
  win = list_window("My list window")

root = tk.Tk()
win = list_window("My List")
root.mainloop()
将tkinter作为tk导入
类列表窗口(tk.Toplevel):
定义初始化(self,title,*args,**kwargs):
tk.Toplevel.\uuuu init\uuuuu(self,None,*args,**kwargs)
自己的头衔(头衔)
自几何体('1500x600')
self.outer_frame=tk.frame(self)
canvas=tk.canvas(自身外部框架)
self.list\u frame=tk.frame(画布)
scrollbar=tk.scrollbar(self.outer_frame,orient=“vertical”,command=canvas.yview)
configure(yscrollcommand=scrollbar.set,yscrollincrement=10)
def scrollhelper(事件):
configure(scrollregion=canvas.bbox(“全部”))
self.list\u frame.bind(“,scrollhelper)
自外包装(side=“top”,fill=“both”,expand=1)
滚动条包装(side=“right”,fill=“y”)
canvas.pack(side=“left”,fill=“both”,expand=1)
canvas.create_window((0,0),window=self.list_frame,anchor='nw')
#例如,填充一堆小部件
随机输入
对于范围(1000)内的i:
对于范围(10)内的j:
tk.Label(self.list\u frame,text=str(random.random())).grid(row=i,column=j)
def spawn_list_window():
win=列表窗口(“我的列表窗口”)
root=tk.tk()
win=列表\窗口(“我的列表”)
root.mainloop()

你知道吗,有一些小部件,比如
ttk.Treeview
tk.Listbox
,它们将完成你试图使用标签所做的事情吗?它会让人抓狂,因为你使用了太多的标签,试图使用画布滚动,试图滚动10000个小部件可能总是有点抓狂。如果您所做的只是显示字符串列表,你为什么不使用listbox或treeview?你知道吗,有一些小部件,如
ttk.treeview
tk.listbox
,它们将完成你试图使用标签来完成的任务?这很令人抓狂,因为你使用了太多标签,试图使用画布来滚动10000个小部件可能总是有点困难急促而不流畅的如果您所做的只是显示字符串列表,那么为什么不使用listbox或treeview呢?非常好!我不知道Treeview,它的效果要好得多。非常感谢。问题:Treeview可以将小部件作为组件而不是字符串或数字处理吗?我不确定这一点非常好!我不知道Treeview,它的效果要好得多。非常感谢。问题:Treeview可以将小部件作为组件而不是字符串或数字处理吗?我不确定这一点
import tkinter as tk

from tkinter import ttk    

class Treeview(ttk.Treeview):
    def __init__(self, master, headings: list, col_widths: list = None, binds: dict = None):
        super().__init__(master=master, columns=headings, show="headings")

        self.col_widths = [] if col_widths is None else col_widths

        self.scroll = ttk.Scrollbar(self)

        self.configure(yscrollcommand=self.scroll.set)
        self.scroll.configure(command=self.yview)

        # Bind events to commands
        if isinstance(binds, dict):
            for k, v in binds.items():
                try:
                    self.bind(f"<{k}>", v)
                except tk.TclError:
                    self.bind(f"{k}", v)

        self.reset()

        self.scroll.pack(side=tk.RIGHT, fill=tk.Y)

    # Append rows to the treeview
    def populate(self, data, top_down=False):
        for i, d in enumerate(data):
            self.insert("", 0 if top_down else "end", values = d)

    # Clears the entire tree
    def clear(self):
        self.delete(*self.get_children())

    def reset(self):           
        for i, col in enumerate(self["columns"]):
            self.heading(col, text=col)

            if i < len(self.col_widths):
                self.column(col, minwidth=self.col_widths[i], width=self.col_widths[i], stretch=tk.NO)

    # Returns the first value which was selected
    def one(self):
        try:
            item = self.item(self.selection()[0])["values"]
        except IndexError:  # Normally this happens if the item selected is the column header
            return None
        else:
            return item
root = tk.Tk()

tree = Treeview(root, [f"Heading {i+1}" for i in range(10)])

data = []
for i in range(1000):
    data.append([])
    for j in range(10):
        data[-1].append(random.random())

tree.populate(data)   

tree.pack(expand=True, fill=tk.BOTH)

root.mainloop()