Tkinter网格中的滚动条
问题内容:
这个问题已经在这里有了答案 :
8年前关闭。
可能重复:
将滚动条添加到Tkinter中的小部件网格
在我的项目中,我想使用Tkinter作为GUI在窗口中显示结果。我使用网格小部件将它们放在一种表中,并且该窗口分为两个不同的部分(用于不同的结果)。但是,经过更长的运行后,显示的结果数超过了我的屏幕高度,因此我想向程序添加滚动条。我已经在这里讨论了关于stackoverflow的几个问题,而最接近的答案是:
在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()
问题答案:
使布莱恩·奥克利的答案适应您的特定问题:
- 以画布为父创建框架
- 使用canvas作为参数
scrollregion
注意:在python中进行子类化时,您不需要存储parent的结果,__init__
因为它可以对self进行操作。
这是补丁:
def __init__(self,name):
self.name = name
- self.frame=tk.Frame.__init__(self,root)
if name=="BotWin":
+ self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
+ tk.Frame.__init__(self,self.canvas)
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.canvas.create_window((4,4), window=self)
self.bind("<Configure>", self.OnFrameConfigure)
elif name=="TopWin":
+ self.frame=tk.Frame.__init__(self,root)
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)
@@ -41,7 +40,7 @@
toprow+=1
def OnFrameConfigure(self, event):
- self.canvas.configure(scrollregion=self.frame.bbox("all"))
+ self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def addrowBot(self,stuff,otherstuff):
global botrow