【问题标题】:Tkinter double tk.Text wont scroll with the same scrollbarTkinter double tk.Text 不会使用相同的滚动条滚动
【发布时间】:2021-10-14 23:15:41
【问题描述】:

我希望滚动条同时滚动tk.Text。我尝试了很多东西,比如 tk.Scrollbar: (command=self.multiple_scroll) 的函数和这个当前配置:

self.reader = tk.Toplevel(self)
self.reader.title("XXX")
self.reader.resizable(False, True)
self.reader.geometry("650x500")
self.reader.minsize(650,150)

self.panel = tk.Text(self.reader, wrap="word", width=12, font=('Courier',14))
self.viewer = tk.Text(self.reader, wrap="word", font=('Courier',14))
self.scrollbar = tk.Scrollbar(self.reader, command=(self.panel.yview, self.viewer.yview))

self.panel.configure(yscrollcommand=self.scrollbar.set)
self.viewer.configure(yscrollcommand=self.scrollbar.set)

self.scrollbar.pack(side="right", fill="y")
self.panel.pack(side="left", fill="both", expand=True)
self.viewer.pack(side="bottom", fill="both", expand=True)

当我使用滚轮滚动时,光标下的文本会移动,但不会移动另一个。我需要将两个tk.Text 分开。

【问题讨论】:

  • command=(self.panel.yview, self.viewer.yview) 不执行 self.panel.yviewself.viewer.yview。您可以改用lambdacommand=lambda *args: (self.panel.yview(*args), self.viewer.yview(*args))。对于鼠标滚轮问题,您需要在 self.panelself.viewer 上绑定 <MouseWheel> 并滚动绑定回调中的两个文本框。除了鼠标滚轮问题,当其中一个文本框被键盘滚动时,您还需要同步两个框。
  • @acw1668 最后你不应该将 lambda 用于多个函数调用,只需定义一个单独的函数并调用它

标签: python tkinter tk tkinter-text


【解决方案1】:

从这里复制:Python tkinter, Making two text widget's scrolling synchronize,当然还有更重要的这里:Multiple commands to a button in tkinter,上面写着:

To do "two things with one button", the correct solution is to create a function that does these "two things", and then associate that function with the button.

我最终得到:

将 tkinter 导入为 tk


class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.reader= parent
        
        # self.reader = tk.Toplevel(self)
        self.reader.title("XXX")
        self.reader.resizable(False, True)
        self.reader.geometry("650x50")
        self.reader.minsize(650,150)
        
        self.panel = tk.Text(self.reader, wrap="word", width=12, font=('Courier',14))
        self.viewer = tk.Text(self.reader, wrap="word", font=('Courier',14))
        # self.scrollbar = tk.Scrollbar(self.reader, command=(self.panel.yview, self.viewer.yview))
        
        self.scrollbar = tk.Scrollbar(self.reader, command=(self.on_scrollbar))
        
        #self.panel.configure(yscrollcommand=self.scrollbar.set)
        #self.viewer.configure(yscrollcommand=self.scrollbar.set)
        
        self.scrollbar.pack(side="right", fill="y")
        self.panel.pack(side="left", fill="both", expand=True)
        self.viewer.pack(side="bottom", fill="both", expand=True)
        
        
        
        # Changing the settings to make the scrolling work
        # self.scrollbar['command'] = self.on_scrollbar
        self.panel['yscrollcommand'] = self.on_textscroll
        self.viewer['yscrollcommand'] = self.on_textscroll
        
        
    def on_scrollbar(self, *args):
        """
        Scrolls both text widgets when the scrollbar is moved
        """
        self.panel.yview(*args)
        self.viewer.yview(*args)
            
    def on_textscroll(self, *args):
        '''Moves the scrollbar and scrolls text widgets when the mousewheel
        is moved on a text widget'''
        self.scrollbar.set(*args)
        self.on_scrollbar('moveto', args[0])



if __name__ == "__main__":
    master = tk.Tk()
   
    MainApplication(master)  
    master.mainloop()  

让我们知道它是否按预期工作,我注意到的是,一旦两个文本之一到达末尾,另一个文本继续在小于最长文本的窗口中保持两个文本不对齐。不知道怎么处理,需要想办法添加空行,让两个文本有相同的长度,如果有更好的请告诉我

【讨论】:

    猜你喜欢
    • 2015-04-03
    • 2016-07-07
    • 1970-01-01
    • 2021-09-01
    • 2018-04-25
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    相关资源
    最近更新 更多