[英]Setting two widgets side by side with scrollbars using TkInter
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.
我正在尝试使用 TkInter 将两者和一个垂直滚动条粘贴到每个滚动条和一个同时移动的水平滚动条。
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 和 file2data 都是长字符串):
file1data = {qUdYzh5H5ilpZZQ6gFklTt3JFy8rTy2QSGQip0blDWj18VIkxBEAHTL18xf1S1tGbmvb0laqYx1gTsrDa3nnkTR6KstOWvJiWpY4v308Mtw5NIEq8sYRt0mFoR0WzHVvak7RmOHR0v3VijwfPRGBq93nIsTxGJVuvWYnPGUDXciuS650s6pbdOtzKaSKaWf2jFFAIBEgwpWNTrQSLkKgg0h5eA8IYdnrrroXsak3Oiq3asU7tThnUPps1rRl2oXe
8e0ZxkWL34kjB1cX3lGae7ixys7nRUQJYiFWUeVsE19u31gPxxy5mzrf9bgkP055Dk5Oquwyeg0tWBsIeMatJd1cgm5cbsgXwM0wuBjeKTFg6MCWQCSFrUpVlr0Uz3ZNEOCDKVePhGDSOJnNbe6Qvx41GeDIRBXdVw12PrD8QWAGK2OPQ5FfwgObBmMV3cEYlQJGNgXowTICaUfNQRfpuGN5CnoksIQ4E4MaOv13dnIpUPXWc3QCu1bf3cmhNoUP
rXcxVi7ZkJ8AtvtRrdZSNUU34msnNrFIPNBoJmqkZTr7E3QCMHyMfZbVQwaThO5q1OCfOA2oZ26VZHzZamTXGleHVXoARH0OQ0XFZsYwwz8tnWqtPuAzAVcjJtdUNxrPbKFlPei1MzschurpyvTwe9pi86oKp1P72XDUhnvJ3kAfRj1kjxSeQFEGX28Op0PtOzoc2taGlgyLO5THiLruSnLNBVKZMt9wBefu4vtjB8riD7itodprVoT960YlDGgQ
dY93hAPuyb8O6qn3olYbrm0Hp65XpSRZoWjo09XhEjVbC7chDWoUWjcrqMVZibcwxAx4HOHJgUrL3QU10U3FQP0JvYCTJkdR5OxLQCWrBCylU43FNEUuGgqnyPWH6nADtI6euwHpFowX4SfMKXBzdWv7ROuJ6QMxypYwo2wLA7yy9AaimVZOfFOnXwd7GNsYGfM4Cdsq4I0WsSgJLUPQeQTj5Xs8E9sp8Y8ykOHSebI7frQagRKgwRAUila0ERBn}
Question: How could I do this multi-widget single scrollbar?问题:我怎么能做这个多小部件单滚动条?
In standard Tkinter, these methods and options have standard names;
在标准 Tkinter 中,这些方法和选项具有标准名称; 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.
当滚动条发生变化时,滚动条应该调用小部件的 xview 或 yview 方法,小部件提供在需要更新滚动条时调用的 xscrollcommand 和 yscrollcommand 命令选项。
read more here: http://effbot.org/zone/tkinter-scrollbar-patterns.htm在这里阅读更多: http://effbot.org/zone/tkinter-scrollbar-patterns.htm
scrollbar needs to call a function that calls the yview
method of your two widgets:滚动条需要调用调用两个小部件的
yview
方法的 function:
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编辑 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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.