Reputation: 1677
Scenario: I have two long series of strings of text that should be displayed side-by-side for comparison. I am trying to use TkInter to paste both and a vertical scrollbar to each and a single horizontal scrollbar that moves both at once.
Issue: I was able to insert the contents side by side in two different widgets and was able to insert a vertical scrollbar to both. But I am having trouble inserting one horizontal scrollbar that scroll both widgets at the same time
Code so far:
import tkinter as tk
root = tk.Tk()
S1 = tk.Scrollbar(root)
template1 = tk.Text(root, height=100, width=100)
S1.pack(side=tk.RIGHT, fill=tk.Y)
template1.pack(side=tk.RIGHT, fill=tk.Y)
template1.config(yscrollcommand=S1.set)
template1.insert(tk.END, file1data)
S2 = tk.Scrollbar(root)
template2 = tk.Text(root, height=100, width=100)
S2.pack(side=tk.RIGHT, fill=tk.Y)
template2.pack(side=tk.RIGHT, fill=tk.Y)
template2.config(yscrollcommand=S2.set)
template2.insert(tk.END, file2data)
S3 = tk.Scrollbar(root)
template3 = tk.Text(root, height=100, width=100)
S3.pack(side=tk.RIGHT, fill=tk.Y)
template3.pack(side=tk.RIGHT, fill=tk.Y)
template3.config(xscrollcommand=S3.set)
template3.insert(tk.END)
tk.mainloop()
Data example (both file1data and file2data are just long strings life this):
file1data = {qUdYzh5H5ilpZZQ6gFklTt3JFy8rTy2QSGQip0blDWj18VIkxBEAHTL18xf1S1tGbmvb0laqYx1gTsrDa3nnkTR6KstOWvJiWpY4v308Mtw5NIEq8sYRt0mFoR0WzHVvak7RmOHR0v3VijwfPRGBq93nIsTxGJVuvWYnPGUDXciuS650s6pbdOtzKaSKaWf2jFFAIBEgwpWNTrQSLkKgg0h5eA8IYdnrrroXsak3Oiq3asU7tThnUPps1rRl2oXe
8e0ZxkWL34kjB1cX3lGae7ixys7nRUQJYiFWUeVsE19u31gPxxy5mzrf9bgkP055Dk5Oquwyeg0tWBsIeMatJd1cgm5cbsgXwM0wuBjeKTFg6MCWQCSFrUpVlr0Uz3ZNEOCDKVePhGDSOJnNbe6Qvx41GeDIRBXdVw12PrD8QWAGK2OPQ5FfwgObBmMV3cEYlQJGNgXowTICaUfNQRfpuGN5CnoksIQ4E4MaOv13dnIpUPXWc3QCu1bf3cmhNoUP
rXcxVi7ZkJ8AtvtRrdZSNUU34msnNrFIPNBoJmqkZTr7E3QCMHyMfZbVQwaThO5q1OCfOA2oZ26VZHzZamTXGleHVXoARH0OQ0XFZsYwwz8tnWqtPuAzAVcjJtdUNxrPbKFlPei1MzschurpyvTwe9pi86oKp1P72XDUhnvJ3kAfRj1kjxSeQFEGX28Op0PtOzoc2taGlgyLO5THiLruSnLNBVKZMt9wBefu4vtjB8riD7itodprVoT960YlDGgQ
dY93hAPuyb8O6qn3olYbrm0Hp65XpSRZoWjo09XhEjVbC7chDWoUWjcrqMVZibcwxAx4HOHJgUrL3QU10U3FQP0JvYCTJkdR5OxLQCWrBCylU43FNEUuGgqnyPWH6nADtI6euwHpFowX4SfMKXBzdWv7ROuJ6QMxypYwo2wLA7yy9AaimVZOfFOnXwd7GNsYGfM4Cdsq4I0WsSgJLUPQeQTj5Xs8E9sp8Y8ykOHSebI7frQagRKgwRAUila0ERBn}
Question: How could I do this multi-widget single scrollbar?
Upvotes: 0
Views: 1702
Reputation: 7206
In standard Tkinter, these methods and options have standard names; the scrollbar should call the widget’s xview or yview method when the scrollbar is changed, and the widgets provide xscrollcommand and yscrollcommand command options that are called when the scrollbar needs to be updated.
read more here: http://effbot.org/zone/tkinter-scrollbar-patterns.htm
scrollbar needs to call a function that calls the yview
method of your two widgets:
def viewall(*args):
template1.yview(*args)
template2.yview(*args)
S4 = tk.Scrollbar(root, command=viewall)
S4.pack(side=tk.RIGHT, fill=tk.Y)
EDIT: two text widget's scrolling synchronized - HORIZONTAL
import tkinter as tk
root = tk.Tk()
file1data = ("qUdYzh5H5ilpZZQ6gFklTt3JFy8rTy2QSGQip0blDWj18VIkxBEAHTL1\n8xf1S1tGbmvb0laqYx1gTsrDa3nnkTR6KstOWvJiWpY4v308Mtw5NIEq8sYRt0mFoR0WzHVvak7RmOHR0v3VijwfPRGBq93nIsTxGJVuvWYnPGUDXciuS650s6pbdOtzKaSKaWf2jFFAIBEgwpWNTrQSLkKgg0h5eA8IYdnrrroXsak3Oiq3asU7tThnUPps1rRl2oXe8e0ZxkWL34kjB1cX3lGae7ixys7nRUQJYiFWUeVsE19u31gPxxy5mzrf9bgkP055Dk5Oquwyeg0tWBsIeMatJd1cgm5cbsgXwM0wuBjeKTFg6MCWQCSFrUpVlr0Uz3ZNEOCDKVe\nPhGDSOJnNbe6Qvx41GeDIRBXdVw12PrD8QWAGK2OPQ5FfwgObBmMV3cEYlQJGNgXowTICaUfNQRfpuGN5CnoksIQ4E4MaOv13dnIpUPXWc3QCu1bf3cmhNoUPrXcxVi7ZkJ\n8AtvtRrdZSNUU34msnNrFIPNBoJmqkZTr7E3QCMHyMfZbVQwaThO5q1OCfOA2oZ26VZHzZamTXGleH\nVXoARH0OQ0XFZsYwwz8tnWqtPuAzAVcjJtdUNxrPbKFlPei1MzschurpyvTwe9pi86oKp1P72XDUhnvJ3kAfRj1kjxSeQFEGX28Op0PtOzoc2taGlgyLO5THiLruSnLNBVKZMt9wBefu4vtjB8riD7itodprVoT960YlDGgQdY93hAPuyb8O6qn3olYbrm0Hp65XpSRZoWjo09")
def viewall(*args):
template1.xview(*args)
template2.xview(*args)
xscrollbar = tk.Scrollbar(root, orient=tk.HORIZONTAL)
xscrollbar.grid(row=1, columnspan=2, sticky=tk.N + tk.S + tk.E + tk.W)
xscrollbar.config(command=viewall)
template1 = tk.Text(root, height=50, width=50,wrap=tk.NONE, xscrollcommand = xscrollbar.set)
template1.grid(row=0, column=0)
template1.insert(tk.END, file1data)
template2 = tk.Text(root, height=50, width=50,wrap=tk.NONE, xscrollcommand = xscrollbar.set)
template2.grid(row=0, column=1)
template2.insert(tk.END, file1data)
tk.mainloop()
======================================
EDIT 2
import tkinter as tk
root = tk.Tk()
file1data = ("qUdYzh5H5ilpZZQ6gFklTt3JFy8rTy2QSGQip0blDW j18VIkxBEAHTL1\n8xf1S1tGbmvb0laqYx1gTsrDa3 nnkTR6KstOWvJiWpY4v308Mt w5NIEq8sYRt0mFoR 0WzHVva 7RmOHR0v3Vi jwfPRG Bq93nIsTxGJV uvWY nPGUDXciuS650s6pbd OtzKaSKa Wf2jFFAIBEgw pWNTrQSLk Kgg0h5eA8IYd nrrroXsak3Oiq3asU7tThnUPps1rRl2oXe8e0ZxkWL34kjB1cX3lGae7ixys7nRUQJYiFWUeVsE19u31gPxxy5mzrf9bgkP055Dk5Oquw yeg0tWBsIeMatJd1cgm5cbsg XwM0wuBjeKTFg6MCWQCSFrUpVlr0Uz3ZNEOCDKVe\nPhGDSOJnNbe6Qvx41GeDIRBXdVw12PrD8QWAGK2OQ4E4MaOv13dnIpUPXWc3QCu1bf3cmhNoUPrXcxVi7ZkJ\n8AtvtRrdZSNUU34msnNrFIPNBoJmqkZ Tr7E3QCMHyMfZbVQwaThO5q1OCfOA2oZ26VZHzZamTXGleH\nVXoARH0OQ0XFZsYwwz8tnWqtPuAzAVcjJtdUNxrPbKFlPei1MzschurpyvTwe9pi86oKp1P72XDUhnvJ3kAfRj1kjxSeQFEGX28Op0PtOzoc2taGlgy")
def viewall(*args):
template1.xview(*args)
template2.xview(*args)
xscrollbar = tk.Scrollbar(root, orient=tk.HORIZONTAL)
xscrollbar.grid(row=1, columnspan=4, sticky=tk.N + tk.S + tk.E + tk.W)
xscrollbar.config(command=viewall)
S1 = tk.Scrollbar(root)
S1.grid(row=0, column=1,sticky=tk.N + tk.S + tk.E + tk.W)
template1 = tk.Text(root, height=25, width=50,wrap=tk.NONE, xscrollcommand = xscrollbar.set, yscrollcommand=S1.set)
template1.grid(row=0, column=0)
template1.insert(tk.END, file1data)
S1.config(command=template1.yview)
S2 = tk.Scrollbar(root)
S2.grid(row=0, column=3,sticky=tk.N + tk.S + tk.E + tk.W)
template2 = tk.Text(root, height=25, width=50,wrap=tk.NONE, xscrollcommand = xscrollbar.set,yscrollcommand=S2.set)
template2.grid(row=0, column=2)
template2.insert(tk.END, file1data)
S2.config(command=template2.yview)
tk.mainloop()
Upvotes: 3