Python Tkinter - поместите вертикальную и горизонтальную полосу прокрутки по краю холста - PullRequest
0 голосов
/ 17 июня 2019

Я хочу разместить горизонтальные и вертикальные полосы прокрутки на краю желтого холста, используя Python tkinter, но что бы я ни делал, он не двигается и просто остается внутри периметра холста.Зачем?Ниже изображение:

enter image description here

Ниже приведен код:

 def render_gui(self):

    self.main_window = tk.Tk()
    self.main_window.geometry("1000x600")
    self.main_window.title("Damaged Text Document Virtual Restoration")
    self.main_window.resizable(True, True) 
    self.main_window.configure(background="#d9d9d9")
    self.main_window.configure(highlightbackground="#d9d9d9")
    self.main_window.configure(highlightcolor="black")


    self.main_canvas = tk.Canvas(self.main_window, bg = "yellow")
    self.main_canvas.pack(expand = True, fill = "both")

    vsb = tk.Scrollbar(self.main_canvas, orient="vertical", command=self.main_canvas.yview)
    hsb = tk.Scrollbar(self.main_canvas, orient="horizontal", command=self.main_canvas.xview)
    vsb.grid(row=1, column=50,columnspan = 20, sticky='ns')
    hsb.grid(row=20, column=1,rowspan = 20,sticky = 'wes')

    self.main_canvas.configure(yscrollcommand=vsb.set,xscrollcommand=hsb.set)
    self.main_window.mainloop()

Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 17 июня 2019

Проблема в том, что вы помещаете полосы прокрутки внутри холста, и вы больше ничего не помещаете в холст.

Когда вы используете grid, чтобы поместить что-то в другой виджет, пустые строки и столбцы имеют размер ноль.Таким образом, даже если вы поместите вертикальную полосу прокрутки в столбец 50, столбцы 0 и 2-49 будут иметь нулевую ширину, поэтому столбец 50 появится слева.(Столбец 1 - это ширина горизонтальной полосы прокрутки.)

То же самое относится и к горизонтальной полосе прокрутки - вы помещаете ее в строку 20, но строки 0 и 2-19 имеют высоту нуля, поэтомуРяд 20 появляется около вершины.

Обычно не рекомендуется помещать полосы прокрутки внутри холста, поскольку все, что вы рисуете на холсте, может быть скрыто или частично скрыто панелями прокрутки.Если вы хотите, чтобы они отображались на холсте , самое простое решение - поместить холст и полосы прокрутки в рамку.Затем вы можете отключить рамку на холсте и включить рамку для рамки.

Пример:

import tkinter as tk

class Example():

 def render_gui(self):

    self.main_window = tk.Tk()
    self.main_window.geometry("1000x600")
    self.main_window.title("Damaged Text Document Virtual Restoration")
    self.main_window.resizable(True, True) 
    self.main_window.configure(background="#d9d9d9")
    self.main_window.configure(highlightbackground="#d9d9d9")
    self.main_window.configure(highlightcolor="black")

    canvas_container = tk.Frame(self.main_window, bd=1, relief='sunken')
    canvas_container.pack(expand = True, fill = "both")

    self.main_canvas = tk.Canvas(canvas_container, bg = "yellow")
    vsb = tk.Scrollbar(canvas_container, orient="vertical", command=self.main_canvas.yview)
    hsb = tk.Scrollbar(canvas_container, orient="horizontal", command=self.main_canvas.xview)
    self.main_canvas.configure(yscrollcommand=vsb.set,xscrollcommand=hsb.set)

    vsb.grid(row=0, column=1, sticky="ns")
    hsb.grid(row=1, column=0, sticky="ew")
    self.main_canvas.grid(row=0, column=0, sticky="nsew")
    canvas_container.grid_rowconfigure(0, weight=1)
    canvas_container.grid_columnconfigure(0, weight=1)

    self.main_window.mainloop()

e = Example()
e.render_gui()
2 голосов
/ 17 июня 2019

Код имеет холст в качестве родителя для полос прокрутки.

Установка полос прокрутки для того же родительского элемента, что и у холста, и изменение нескольких элементов размещения вокруг, делает что-то работоспособным:

import tkinter as tk

class test:
    def __init__(self):
        self.render_gui()

    def render_gui(self):
        self.main_window = tk.Tk()
        self.main_window.geometry("1000x600")
        self.main_window.title("Damaged Text Document Virtual Restoration")
        self.main_window.resizable(True, True) 
        self.main_window.configure(background="#d9d9d9")
        self.main_window.configure(highlightbackground="#d9d9d9")
        self.main_window.configure(highlightcolor="black")

        self.main_canvas = tk.Canvas(self.main_window, bg = "yellow")
        vsb = tk.Scrollbar(self.main_window, orient="vertical", command=self.main_canvas.yview)
        hsb = tk.Scrollbar(self.main_window, orient="horizontal", command=self.main_canvas.xview)
        hsb.pack(side = "bottom", fill = "x")
        vsb.pack(side = "right", fill = "y")
        self.main_canvas.pack(expand = True, fill = "both")

        self.main_canvas.configure(yscrollcommand=vsb.set,xscrollcommand=hsb.set)
        self.main_window.mainloop()

t = test()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...