简体   繁体   English

使用 TkInter 将两个小部件与滚动条并排设置

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM