Python Tkinter网格中的滚动条

Python Tkinter网格中的滚动条,python,grid,tkinter,scrollbar,Python,Grid,Tkinter,Scrollbar,可能重复: 在我的项目中,我希望使用Tkinter作为GUI在窗口中显示结果。我使用网格小部件将它们放在一种表格中,窗口分为两个不同的部分(用于不同的结果)。但是在长时间运行之后,显示的结果数量超过了屏幕的高度,因此我想在程序中添加一个滚动条。我已经研究了stackoverflow的几个问题,最接近的答案是: (只是想让你知道我在找什么!) 不过,我无法将其应用到我的程序中,可能是因为我对Python相当陌生,有时会认为我是一个有教程示例的弗兰肯斯坦博士 我现在尝试了很多,但我无法让表格显示

可能重复:

在我的项目中,我希望使用Tkinter作为GUI在窗口中显示结果。我使用网格小部件将它们放在一种表格中,窗口分为两个不同的部分(用于不同的结果)。但是在长时间运行之后,显示的结果数量超过了屏幕的高度,因此我想在程序中添加一个滚动条。我已经研究了stackoverflow的几个问题,最接近的答案是:

(只是想让你知道我在找什么!)

不过,我无法将其应用到我的程序中,可能是因为我对Python相当陌生,有时会认为我是一个有教程示例的弗兰肯斯坦博士

我现在尝试了很多,但我无法让表格显示在画布上,可能只是我遗漏了一些小东西

我为我的程序创建了一个抽象的例子(没有滚动条),这样你就知道我在用什么了,也许你们中的某个人可以帮我把滚动条放在它应该放的地方

多谢各位

示例代码:(运行)

my的附加代码尝试添加滚动条(基于上面链接中显示的示例)。 如果滚动条只显示在较低的部分,那就可以了,因为这是有很多结果的部分。)

将Tkinter作为tk导入
顶行=1
botrow=1
类程序窗口(tk.Frame):
定义初始化(self,name):
self.name=名称
self.frame=tk.frame.\uuuu init\uuuu(self,root)
如果name==“BotWin”:
标签(self,text=“FirstColBot”,宽度=30).grid(行=0,列=0)
标签(self,text=“SecndColBot”,宽度=20).grid(行=0,列=1)
self.canvas=tk.canvas(根,borderwidth=0,background=“#ffffffff”)
self.vsb=tk.Scrollbar(root,orient=“vertical”,command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
自包装(side=“right”,fill=“y”)
self.canvas.pack(side=“left”,fill=“both”,expand=True)
self.canvas.create_window((4,4),window=self.frame)
self.bind(“,self.OnFrameConfigure)
elif名称==“TopWin”:
self.pack()
标签(self,text=“FirstColTop”,宽度=30).grid(行=0,列=0)
标签(self,text=“SecndColTop”,宽度=20).grid(行=0,列=1)
def addrowTop(自我、材料、其他材料):
全局顶行
textfield=tk.Text(self,宽度=30,高度=1)
textfield.grid(行=toprow,列=0)
textfield.insert('0.0',stuff)
textfield=tk.Text(self,宽度=20,高度=1)
textfield.grid(行=toprow,列=1)
textfield.insert('0.0',otherstuff)
toprow+=1
def OnFrameConfigure(自我,事件):
self.canvas.configure(scrollregion=self.frame.bbox(“全部”))
def addrowBot(自我、材料、其他材料):
全球僵尸
textfield=tk.Text(self,宽度=30,高度=1)
textfield.grid(行=botrow,列=0)
textfield.insert('0.0',stuff)
textfield=tk.Text(self,宽度=20,高度=1)
textfield.grid(行=botrow,列=1)
textfield.insert('0.0',otherstuff)
botrow+=1
def SomeProg():
对于范围(20)内的i:
如果i%2==0:
stuff=“stuff is”+str(i)
otherstuff=i*3
Wins[0]。添加行顶(stuff,otherstuff)
elif i%2==1:
stuff=“stuff is”+str(i)
otherstuff=i*4
Wins[1]。addrowBot(stuff,otherstuff)
root=tk.tk()
root.title(“东西”)
Wins=[ProgramWindow(“TopWin”)、ProgramWindow(“BotWin”)]
SomeProg()
root.mainloop()

从你的问题中,我很确定我可以帮助你,几个月前我遇到了类似的问题,我尝试了很多不同的解决方案,最后我从ttk模块中发现了ttk treeview小部件,它是python 2.7的标准配置

这里有一个小例子来帮助你理解我的意思

from Tkinter import *
import ttk
root = Tk()
treedata = [('column 1', 'column 2'), ('column 1', 'column 2')]
column_names = ("heading1", "heading2")
tree = ttk.Treeview(root, columns = column_names, yscrollcommand = scrollbar.set)
scrollbar = ttk.Scrollbar(root)
scrollbar.pack(side = 'right', fill= Y)
for x in treedata:
    tree.insert('', 'end', values =x)
for col in column_names: 
    tree.heading(col, text = col.Title())
scrollbar.config(command=tree.yview)
tree.pack()
希望这有帮助这方面没有太多文档,但谷歌会提供帮助, 一个非常有用的链接:

祝你好运:)

要适应你的具体问题:

  • 以画布作为父对象创建框架
  • 使用画布作为
    scrollregion
注意:在python中进行子类化时,不需要存储父级
\uuuu init\uuuu
的结果,因为它是在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
def\uuuu init\uuuu(self,name):
self.name=名称
-self.frame=tk.frame.\uuuu init\uuuu(self,root)
如果name==“BotWin”:
+self.canvas=tk.canvas(根,borderwidth=0,background=“#ffffffff”)
+tk.Frame.\uuuu init\uuuu(self,self.canvas)
标签(self,text=“FirstColBot”,宽度=30).grid(行=0,列=0)
标签(self,text=“SecndColBot”,宽度=20).grid(行=0,列=1)
-self.canvas=tk.canvas(根,borderwidth=0,background=“#ffffffff”)
self.vsb=tk.Scrollbar(root,orient=“vertical”,command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
自包装(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(“,self.OnFrameConfigure)
elif名称==“TopWin”:
+self.frame=tk.frame.\uuuu init\uuuu(self,root)
self.pack()
标签(self,text=“FirstColTop”,宽度=30).grid(行=0,列=0)
标签(self,text=“SecndColTop”,宽度=20).grid(行=0,列=1)
@@ -41,7 +40,7 @@
toprow+=1
def OnFrameConfigure(自我,事件):
-self.canvas.configure(scrollregion=self.frame.bbox(“全部”))
+self.canvas.configure(scrollregion=self.canvas.bbox(“全部”))
def addrowBot(自我、材料、其他材料):
全球僵尸

中提供的精彩答案和示例无需添加任何内容
from Tkinter import *
import ttk
root = Tk()
treedata = [('column 1', 'column 2'), ('column 1', 'column 2')]
column_names = ("heading1", "heading2")
tree = ttk.Treeview(root, columns = column_names, yscrollcommand = scrollbar.set)
scrollbar = ttk.Scrollbar(root)
scrollbar.pack(side = 'right', fill= Y)
for x in treedata:
    tree.insert('', 'end', values =x)
for col in column_names: 
    tree.heading(col, text = col.Title())
scrollbar.config(command=tree.yview)
tree.pack()
     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