繁体   English   中英

tkinter:如何使用一个垂直滚动条滚动两个画布?

[英]tkinter: How can I use one vertical scroll bar to scroll two canvases?

在我的 UI 中,我需要两个画布,每个画布都有自己的水平滚动条,但有一个滚动条控制两个画布的垂直移动。

以下代码创建两个画布,每个画布都有自己的水平和垂直滚动条。 如何摆脱垂直滚动条之一? 为代码的长度道歉,它尽可能规范。

from tkinter import *
from tkinter import ttk

class MainUI:
    def __init__(self, root):

        mainframe = Frame(root)
        mainframe.grid(column=0, row=0, sticky=(N,W,E,S))

        # set up the first canvas, with large red triangle
        canvas1 = Canvas(mainframe, background="turquoise")
        canvas1.grid(column=1, row=1, sticky=(N,S,W,E))

        canvas1_hscroller = Scrollbar(mainframe, orient="horizontal",command=canvas1.xview)
        canvas1_hscroller.grid(column=1, row=2, sticky=(W,E))
        canvas1.configure(xscrollcommand=canvas1_hscroller.set)

        canvas1_vscroller = Scrollbar(mainframe, orient="vertical",command=canvas1.yview)
        canvas1_vscroller.grid(column=2, row=1, sticky=(N,S))
        canvas1.configure(yscrollcommand=canvas1_vscroller.set)

        points = [0,0,1000,800,800,1000]
        triangle = canvas1.create_polygon(points,fill="red")

        canvas1.configure(scrollregion=canvas1.bbox("all"))

        # set up the second canvas, with large green triangle
        canvas2 = Canvas(mainframe, background="orange")
        canvas2.grid(column=3, row=1, sticky=(N,S,W,E))

        canvas2_hscroller = Scrollbar(mainframe, orient="horizontal",command=canvas2.xview)
        canvas2_hscroller.grid(column=3, row=2, sticky=(W,E))
        canvas2.configure(xscrollcommand=canvas2_hscroller.set)

        canvas2_vscroller = Scrollbar(mainframe, orient="vertical",command=canvas2.yview)
        canvas2_vscroller.grid(column=4, row=1, sticky=(N,S))
        canvas2.configure(yscrollcommand=canvas2_vscroller.set)

        points = [0,0,1000,800,800,1000]
        triangle = canvas2.create_polygon(points,fill="green")

        canvas2.configure(scrollregion=canvas2.bbox("all"))

root = Tk()
ui = MainUI(root)
root.mainloop()

首先制作实例的画布属性:

...
self.canvas1 = Canvas(mainframe, background="turquoise")
...
self.canvas2 = Canvas(mainframe, background="orange")

并使用self. 在您之前引用canvas1canvas2所有地方添加前缀

然后定义一个新方法

def v_scroll(self, *args):
    self.canvas1.yview(*args)
    self.canvas2.yview(*args)

然后只需将滚动条command设置为该方法:

canvas_vscroller = Scrollbar(..., command=self.v_scroll)

此外,不要使用from tkinter import * ,导入模块时使用*是不好的做法。 仅导入您需要的内容。 例如在这种情况下

from tkinter import Tk, Frame, Canvas, Scrollbar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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