Полоса прокрутки в сетке Tkinter [дубликат]
Возможный дубликат:
Добавление полосы прокрутки в сетку виджетов в Tkinter
В моем проекте я хочу отобразить результаты в окне, используя Tkinter в качестве графического интерфейса. Я размещаю их в виде таблицы, используя виджет сетки, и окно разделяется на две разные части (для разных результатов). Но после длительных запусков количество отображаемых результатов превышает высоту моего экрана, поэтому я хочу добавить полосу прокрутки в мою программу. Я уже рассмотрел несколько вопросов здесь по 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()