Как вставить разделитель фрейма между двумя другими фреймами - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь разделить два кадра на третий, который должен выглядеть как вертикальная линия. При использовании менеджера пакетов он всегда отображается слева или справа, независимо от того, как я перетасовываю порядок упаковки и / или side как 'left' или 'right'. Когда я использую сетку, она вообще не отображается. Ниже мой код: EDIT:

Я добавил определение секции импорта / экспорта, чтобы код был полным рабочим примером.

class ImportSection(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        self.lbl_import = tk.Label(self, text='IMPORT', width=20)
        self.lbl_import.grid()


class ExportSection(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        self.lbl_export = tk.Label(self, text='EXPORT', width=20)
        self.lbl_export.grid()

class Main(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.import_section = ImportSection(self)
        self.export_section = ExportSection(self)
        self.sep = tk.Frame(width=2, bd=1, relief='sunken')

        # I tried to shuffle the order and experimented with left/right with no luck.
        # the line is always on the very right or left
        # self.import_section.pack(side='left', padx=5, pady=5, anchor='n')
        # self.export_section.pack(side='left', padx=5, pady=5, anchor='n')
        # self.sep.pack(side='left', fill='y', padx=5, pady=5)

        # another attempt with grid, but the line does not show at all
        self.import_section.grid(row=0, column=0, padx=5, pady=5, sticky='n')
        self.sep.grid(           row=0, column=1, padx=5, pady=5, sticky='ns')
        self.export_section.grid(row=0, column=2, padx=5, pady=5, sticky='n')

if __name__ == '__main__':
    root = tk.Tk()
    app = Main(root)
    # app.pack(side='top', fill='both', expand=True) - I used this version with pack
    app.grid()
    root.mainloop()

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Проблема в том, что кадр, который вы пытаетесь использовать в качестве разделителя, не совпадает с кадром ImportSection и ExportSection, поскольку вы не указали его родительский элемент. Если вы не указали родителя, tkinter сделает виджет дочерним по отношению к корневому окну. Это также причина, по которой вы не можете pack app в корневое окно: self.sep уже введен в корень с grid.

Изменение

self.sep = tk.Frame(width=2, bd=1, relief='sunken')

до

self.sep = tk.Frame(self, width=2, bd=1, relief='sunken')
0 голосов
/ 06 сентября 2018

Вы можете использовать ttk.Separator:

import tkinter as tk
from tkinter import ttk

class Main(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.import_section = tk.Frame(self)
        tk.Canvas(self.import_section, width=200, height=400, bg='cyan').grid(column=0, row=0)
        self.export_section = tk.Frame(self)
        tk.Canvas(self.export_section, width=200, height=400, bg='lightgreen').grid(column=0, row=0)

        self.sep = ttk.Separator(self, orient=tk.VERTICAL)

        self.import_section.grid(row=0, column=0, padx=5, pady=5, sticky='n')
        self.sep.grid(           row=0, column=1, padx=5, pady=5, sticky='ns')
        self.export_section.grid(row=0, column=2, padx=5, pady=5, sticky='n')

if __name__ == '__main__':
    root = tk.Tk()
    app = Main(root)
    app.grid()
    root.mainloop()

enter image description here

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