鱼C论坛

 找回密码
 立即注册
查看: 2333|回复: 3

[已解决]关于tkinter两个text组件绑定一个滚动条的问题

[复制链接]
发表于 2022-8-20 00:24:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
    我用tkinter写了一个文本编辑器,用text控件做了一个显示行数的侧边栏
   
    为了把  侧边栏, 显示文本的text控件, 滚动条  三者的滚动绑定在一起,我写了三个函数分别绑定这三个控件的滚动事件:



def all_yview(*args):  # y_bar 的滚动回调函数,同时设置text text0的位置
    self.text.yview(*args)
    self.text0.yview(*args)

def all_set0(*args):  # text0 的纵向滚动回调函数,同时设置text y_bar的位置
    self.y_bar.set(*args)
    self.text.yview_moveto(args[0])

def all_set(*args):  # text 的纵向滚动回调函数,同时设置text0 y_bar的位置
    self.y_bar.set(*args)
    self.text0.yview_moveto(args[0])
self.text0.config(yscrollcommand=all_set0)
self.text.config(yscrollcommand=all_set)
self.y_bar.config(command=all_yview)


图片如下:

                               
登录/注册后可看大图


    但是实际滚动时,text0和text的滚动总是会逐渐出现差距




                               
登录/注册后可看大图


                               
登录/注册后可看大图


   (ps:)我觉得这可能是tkinter自己的问题,光写python没法解决,但出于强迫症,我还是把他提问到论坛了,希望有遇到一样情况的老哥前来讨论
最佳答案
2022-8-20 02:10:56
from tkinter import *

root = Tk()
root.geometry("750x430")
root.title("PyText")

def mw(event):
    label.yview_scroll(int(-1*(event.delta/120)), "units")
    text.yview_scroll(int(-1*(event.delta/120)), "units")
    return "break" 

def sc(*arg):
    label.yview(*arg)
    text.yview(*arg)

sb = Scrollbar(root, command=sc)
sb.place(x=730, y=5, width=15, height=420)
sb.bind("<MouseWheel>", mw)

label = Text(root, font=("宋体", 12), bg="#F3F3F3", yscrollcommand=sb.set)
label.place(x=5, y=5, width=25, height=420)
label.bind("<MouseWheel>", mw)

text = Text(root, font=("宋体", 12), yscrollcommand=sb.set)
text.place(x=30, y=5, width=695, height=420)
text.bind("<MouseWheel>", mw)

for i in range(1, 100):
    label.insert(INSERT, str(i) + "\n")
    text.insert(INSERT, str(i) + "\n")
    
root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-20 02:10:56 | 显示全部楼层    本楼为最佳答案   
from tkinter import *

root = Tk()
root.geometry("750x430")
root.title("PyText")

def mw(event):
    label.yview_scroll(int(-1*(event.delta/120)), "units")
    text.yview_scroll(int(-1*(event.delta/120)), "units")
    return "break" 

def sc(*arg):
    label.yview(*arg)
    text.yview(*arg)

sb = Scrollbar(root, command=sc)
sb.place(x=730, y=5, width=15, height=420)
sb.bind("<MouseWheel>", mw)

label = Text(root, font=("宋体", 12), bg="#F3F3F3", yscrollcommand=sb.set)
label.place(x=5, y=5, width=25, height=420)
label.bind("<MouseWheel>", mw)

text = Text(root, font=("宋体", 12), yscrollcommand=sb.set)
text.place(x=30, y=5, width=695, height=420)
text.bind("<MouseWheel>", mw)

for i in range(1, 100):
    label.insert(INSERT, str(i) + "\n")
    text.insert(INSERT, str(i) + "\n")
    
root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 10:24:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-20 11:45:12 | 显示全部楼层
已解决, 原因是两个text控件高度相差一个字符导致同样的滚动比率滚动到的位置不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 00:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表