【发布时间】:2012-11-08 14:28:40
【问题描述】:
在我的项目中,我想在一个窗口中显示我的结果,使用 Tkinter 作为 GUI。我使用网格小部件将它们放在一种表格中,并且窗口分为两个不同的部分(用于不同的结果)。但是经过较长时间的运行,显示的结果数量超过了我的屏幕高度,所以我想在我的程序中添加一个滚动条。我已经在 stackoverflow 上查看了几个问题,最接近的答案是:
Adding a scrollbar to a group of widgets in Tkinter (只是为了让你知道我在寻找什么!)
但我无法将其应用到我的程序中,可能是因为我对 Python 比较陌生,有时认为我是一个有教程示例的弗兰肯斯坦博士。
我现在尝试了很多,但我无法让表格显示在画布中,可能只是我缺少一些小东西。
我为我的程序创建了一个抽象示例(没有滚动条),所以您知道我在使用什么,也许您中的某个人可以帮助我将滚动条放在它所属的位置!
非常感谢!
示例代码:(运行)
import Tkinter as tk
toprow=1
botrow=1
class ProgramWindow(tk.Frame):
def __init__(self,name):
self.name = name
tk.Frame.__init__(self,root)
self.pack()
if name=="BotWin":
tk.Label(self,text="FirstColBot",width=30).grid(row=0,column=0)
tk.Label(self,text="SecndColBot",width=20).grid(row=0,column=1)
elif name=="TopWin":
tk.Label(self,text="FirstColTop",width=30).grid(row=0,column=0)
tk.Label(self,text="SecndColTop",width=20).grid(row=0,column=1)
def addrowTop(self,stuff,otherstuff):
global toprow
textfield = tk.Text(self,width=30,height=1)
textfield.grid(row=toprow,column=0)
textfield.insert('0.0',stuff)
textfield = tk.Text(self,width=20,height=1)
textfield.grid(row=toprow,column=1)
textfield.insert('0.0',otherstuff)
toprow+=1
def addrowBot(self,stuff,otherstuff):
global botrow
textfield = tk.Text(self,width=30,height=1)
textfield.grid(row=botrow,column=0)
textfield.insert('0.0',stuff)
textfield = tk.Text(self,width=20,height=1)
textfield.grid(row=botrow,column=1)
textfield.insert('0.0',otherstuff)
botrow+=1
def SomeProg():
for i in range(20):
if i%2==0:
stuff = "Stuff is "+str(i)
otherstuff=i*3
Wins[0].addrowTop(stuff,otherstuff)
elif i%2==1:
stuff = "Stuff is "+str(i)
otherstuff=i*4
Wins[1].addrowBot(stuff,otherstuff)
root = tk.Tk()
root.title("Stuff")
Wins = [ ProgramWindow("TopWin"),ProgramWindow("BotWin")]
SomeProg()
root.mainloop()
我尝试添加滚动条的附加代码(基于上面链接中显示的示例)。 如果滚动条只显示在下部,那也没关系,因为那是结果很多的部分。)
import Tkinter as tk
toprow=1
botrow=1
class ProgramWindow(tk.Frame):
def __init__(self,name):
self.name = name
self.frame=tk.Frame.__init__(self,root)
if name=="BotWin":
tk.Label(self,text="FirstColBot",width=30).grid(row=0,column=0)
tk.Label(self,text="SecndColBot",width=20).grid(row=0,column=1)
self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y")
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((4,4), window=self.frame)
self.bind("<Configure>", self.OnFrameConfigure)
elif name=="TopWin":
self.pack()
tk.Label(self,text="FirstColTop",width=30).grid(row=0,column=0)
tk.Label(self,text="SecndColTop",width=20).grid(row=0,column=1)
def addrowTop(self,stuff,otherstuff):
global toprow
textfield = tk.Text(self,width=30,height=1)
textfield.grid(row=toprow,column=0)
textfield.insert('0.0',stuff)
textfield = tk.Text(self,width=20,height=1)
textfield.grid(row=toprow,column=1)
textfield.insert('0.0',otherstuff)
toprow+=1
def OnFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.frame.bbox("all"))
def addrowBot(self,stuff,otherstuff):
global botrow
textfield = tk.Text(self,width=30,height=1)
textfield.grid(row=botrow,column=0)
textfield.insert('0.0',stuff)
textfield = tk.Text(self,width=20,height=1)
textfield.grid(row=botrow,column=1)
textfield.insert('0.0',otherstuff)
botrow+=1
def SomeProg():
for i in range(20):
if i%2==0:
stuff = "Stuff is "+str(i)
otherstuff=i*3
Wins[0].addrowTop(stuff,otherstuff)
elif i%2==1:
stuff = "Stuff is "+str(i)
otherstuff=i*4
Wins[1].addrowBot(stuff,otherstuff)
root = tk.Tk()
root.title("Stuff")
Wins = [ ProgramWindow("TopWin"),ProgramWindow("BotWin")]
SomeProg()
root.mainloop()
【问题讨论】:
-
没有什么可以添加到您链接的问题中提供的精彩答案和示例中。使用 Brian Oakley 的代码并在所谓的
populate方法中创建您的项目(或将 ProgramWindows 的父级设置为嵌入框架)。如果您向我们展示您卡在哪里/失败的地方比什么有效,您可能会得到更好的反馈...... -
我将使用滚动条编辑/添加代码,但它没有显示我想要的内容
-
我提到了它,应用了它,但它对我不起作用,我不知道为什么。
-
Brian Oakley 示例与您的示例之间的区别是:您的 ProgramWindow 框架没有画布作为父级,
OnFrameConfigure使用self.frame滚动区域而不是self.canvas -
我想要画布的底部,上部可以是正常的部分。当您运行第二个代码时,您会看到在下部有一个画布窗口,我想当我必须将框架分配给画布(这就是为什么它是白色的)和滚动区域(这就是为什么滚动条不可滚动)。我很难改变那个:/
标签: python grid tkinter scrollbar