python - 无法滚动画布 Tkinter
问题描述
我正在尝试创建一个框架(类 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()
解决方案
这段代码对我有用,但经过所有更改后,我不记得我所做的更改。
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()
推荐阅读
- reactjs - Json 对象作为回报工作,但不在渲染中的外部回报
- node.js - 在 mongodb 通知模式中存储不同的 id
- javascript - 无法循环输入并添加它们
- kubernetes - Kafka Pod 无法在 GKE 上启动
- android - 如何在颤动中为底部导航栏图标提供渐变
- laravel - 在 Laravel 5.7 中编码电子邮件
- javascript - 通过在 javascript 中通过 RegExp 包含标记来过滤用户列表数组
- java - Hazelcast IMap.putAll 没有调用 mapstore.store() 或 storeall
- php - Pusher PHP API:生产中保留的最少文件是多少?
- apache-kafka - kafka 通过 flink 到 opentsdb:java.lang.NoClassDefFoundError:无法初始化类 org.apache.http.conn.ssl.SSLConnectionSocketFactory