无法滚动画布Tkinter

问题描述 投票:0回答:1

我正在尝试创建一个框架(类page1)来填充csv的每一行的标签。如果行太多,我希望用户能够滚动查看所有行。

该应用程序从一个不需要滚动条的框架开始(class StartPage

class SeaofBTCapp(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)
        self.frames = {}

        page_list = [StartPage,page1]
        for F in page_list:
            frame = F(container, self, *args)
            self.frames[F] = frame
            frame.grid(row=0, column = 0, sticky="nsew")

        self.show_frame(StartPage)
        canvas = tk.Canvas(self, height = 700,width = 800)
        canvas.pack()

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

class StartPage (tk.Frame):

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

        button = tk.Button(self, text="visit page1", command=lambda: controller.show_frame(page1))
        button.pack()

class page1 (tk.Frame):

    def __init__(self,parent,controller):
        tk.Frame.__init__(self, parent)
        canvas = tk.Canvas(self, height = 700,width = 800)
        canvas.pack()

        csv = pd.read_csv('guitest_sheet/pd_guitest.csv', engine='python')
        csv_df = pd.DataFrame(csv)
        count = 0
        relx = .5
        height = 45
        for row in csv.iterrows() : 
            frame_name = "frame" + str(count)
            frame_name = tk.Frame(canvas, bg="black", bd=5)
            frame_name.place(width=400, height=height, relx=relx, y=((count+1)*height)+10,anchor='center')
            for x in row :
                if type(x) != int: 
                    label = tk.Label(frame_name, text="label")
                    label.place(width=100, anchor="n",relx=.5, rely=0)
            count+=1

        scroll_x = tk.Scrollbar(parent, orient="horizontal", command=canvas.xview)
        scroll_x.grid(row=1, column=0, sticky="ew")

        scroll_y = tk.Scrollbar(parent, orient="vertical", command=canvas.yview)
        scroll_y.grid(row=0, column=1, sticky="ns")

        canvas.configure(yscrollcommand=scroll_y.set, xscrollcommand=scroll_x.set,scrollregion=canvas.bbox('all'))

app = SeaofBTCapp()
app.mainloop()
python python-3.x tkinter scrollbar tkinter-canvas
1个回答
0
投票

这段代码对我有用,但经过所有更改后我都不记得我改变了什么。

import tkinter as tk
import pandas as pd

class SeaofBTCapp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.pack(fill="both", expand=True)

        container.columnconfigure(0, weight=1)
        container.rowconfigure(0, weight=1)

        self.frames = {}

        page_list = [StartPage, Page1]
        for F in page_list:
            frame = F(container, self, *args)
            self.frames[F] = frame
            frame.grid(row=0, column = 0, sticky="news")

        self.show_frame(StartPage)


    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class StartPage (tk.Frame):

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

        button = tk.Button(self, text="visit page1", command=lambda: controller.show_frame(Page1))
        button.pack()

class Page1(tk.Frame):

    def __init__(self,parent,controller):
        tk.Frame.__init__(self, parent)
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)

        self.canvas = tk.Canvas(self)
        self.canvas.grid(row=0, column=0, sticky='news')

        scroll_x = tk.Scrollbar(self, orient="horizontal", command=self.canvas.xview)
        scroll_x.grid(row=1, column=0, sticky="ew")

        scroll_y = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
        scroll_y.grid(row=0, column=1, sticky="ns")

        self.canvas.configure(yscrollcommand=scroll_y.set)
        self.canvas.configure(xscrollcommand=scroll_x.set)

        inner_frame = tk.Frame(self.canvas)
        self.canvas.create_window((0, 0), window=inner_frame, anchor='nw')

        csv = pd.read_csv('test.csv', engine='python')
        for row in csv.iterrows() : 
            frame_name = tk.Frame(inner_frame)
            frame_name.pack()

            for x in row:
                if not isinstance(x, int): 
                    label = tk.Label(frame_name, text="label")
                    label.pack()

        self.canvas.bind('<Configure>', self.inner_resize)

    def inner_resize(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox('all'))


app = SeaofBTCapp()
app.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.