在我的 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()
uj5u.com熱心網友回復:
首先制作實體的畫布屬性:
...
self.canvas1 = Canvas(mainframe, background="turquoise")
...
self.canvas2 = Canvas(mainframe, background="orange")
并self.在您之前參考的任何地方使用前綴canvas1和canvas2
然后定義一個新方法
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
完整示例(使用import tkinter as tk哪個更好):
import tkinter as tk
class MainWindow(tk.Tk):
def __init__(self):
super().__init__()
# set up the first canvas, with large red triangle
self.canvas1 = tk.Canvas(self, background="turquoise")
self.canvas1.grid(column=0, row=0, sticky='news')
self.canvas1_hscroller = tk.Scrollbar(self, orient="horizontal", command=self.canvas1.xview)
self.canvas1_hscroller.grid(column=0, row=1, sticky='we')
self.canvas1.configure(xscrollcommand=self.canvas1_hscroller.set)
points = [0, 0, 1000, 800, 800, 1000]
self.canvas1.create_polygon(points, fill="red")
self.canvas1.configure(scrollregion=self.canvas1.bbox("all"))
# set up the second canvas, with large green triangle
self.canvas2 = tk.Canvas(self, background="orange")
self.canvas2.grid(column=1, row=0, sticky='news')
self.canvas2_hscroller = tk.Scrollbar(self, orient="horizontal", command=self.canvas2.xview)
self.canvas2_hscroller.grid(column=1, row=1, sticky='we')
self.canvas2.configure(xscrollcommand=self.canvas2_hscroller.set)
points = [0, 0, 1000, 800, 800, 1000]
self.canvas2.create_polygon(points, fill="green")
self.canvas2.configure(scrollregion=self.canvas2.bbox("all"))
self.v_scroller = tk.Scrollbar(self, orient='vertical', command=self.v_scroll)
self.v_scroller.grid(column=2, row=0, sticky='ns')
self.canvas1.config(yscrollcommand=self.v_scroller.set)
def v_scroll(self, *args):
self.canvas1.yview(*args)
self.canvas2.yview(*args)
root = MainWindow()
root.mainloop()
順便說一句,行和列從 開始0,因此第一行和第一列將是row=0,column=0因此
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/352500.html
下一篇:來自快速結賬的貝寶交易ID
