鱼C论坛

 找回密码
 立即注册
查看: 2757|回复: 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
  1. from tkinter import *

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

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

  9. def sc(*arg):
  10.     label.yview(*arg)
  11.     text.yview(*arg)

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

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

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

  21. for i in range(1, 100):
  22.     label.insert(INSERT, str(i) + "\n")
  23.     text.insert(INSERT, str(i) + "\n")
  24.    
  25. root.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

  9. def sc(*arg):
  10.     label.yview(*arg)
  11.     text.yview(*arg)

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

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

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

  21. for i in range(1, 100):
  22.     label.insert(INSERT, str(i) + "\n")
  23.     text.insert(INSERT, str(i) + "\n")
  24.    
  25. root.mainloop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 10:24:02 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 05:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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