Расположение разных наборов записей рядом друг с другом в Python Tkinter - PullRequest
0 голосов
/ 11 июля 2019

Я использую фрейм Tkinter в python, и на одной из страниц мне нужно отобразить 2 набора записей, один рядом с другим, где количество записей равно числу в диапазоне (в полной программе переменная переменная, поэтому каждый раз меняется количество записей). Я использую цикл for, чтобы сделать это.

Однако, когда я пытаюсь упаковать записи в фрейм, 2 набора из 3 записей отображаются в одном столбце из 6 записей, вместо того, чтобы показывать 2 столбца с 3 рядами записей в каждом.

Если я настраиваю пакеты для левой и правой сторон кадра, каждый набор записей затем отображается в 1 строке и имеет 3 столбца, которые не нужны.

Когда я использую .place или .grid вместо .pack, то для каждого набора отображается только одна запись (я думаю, что все 3 записи просто помещены в определенное место, например (x = 550, y = 80). ), так что 3 записи «пересекаются» в одну)

Полагаю, мне нужно написать более сложную функцию "для цикла" и использовать позиционирование .grid или .place, чтобы все 3 записи отображались в столбце один за другим.

Или я также думаю, что использование .pack и вставка записей в новый кадр внутри первого кадра, а затем размещение этих двух кадров один рядом с другим может работать. Но я снова попытался создать дополнительный фрейм на первой странице, но он не сработал.

Любые замечания и советы будут высоко оценены!

Вот полный код, так что вы можете попробовать поиграть с ним и увидеть всю картину. (извините за беспорядок в импорте, я тоже должен разобраться)

P.S. Это часть большего кода, где мне нужно использовать более 1 страницы, так что этот код является наименьшим, который работает - если бы в программе был только один кадр, у меня не было бы проблем с упорядочением записей как Я нуждаюсь. Проблема в том, что я не знаю, как организовать записи именно этой структуры.

import tkinter as tk                
from tkinter import font  as tkfont 
import traceback
from tkinter import messagebox
from pandastable.core import Table
from pandastable.data import TableModel

from tkinter import *
from tkinter import ttk

import tkinter as Tkinter
import tkinter.ttk as ttk

LARGE_FONT= ("Verdana", 12)

class MyTable(Table):
    """
      Custom table class inherits from Table.
      You can then override required methods
     """
    def __init__(self, parent=None, **kwargs):
        Table.__init__(self, parent, **kwargs)
        return


class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")

        # the container is where we'll stack a bunch of frames
        # on top of each other, then the one we want visible
        # will be raised above the others
        self.geometry('800x600+200+100')
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (StartPage, PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

            # put all of the pages in the same location;
            # the one on the top of the stacking order
            # will be the one that is visible.
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is the start page", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)


        button2 = tk.Button(self, text="Go to Page Two",
                            command=lambda: controller.show_frame("PageTwo"))
        button2.place(x = 20, y = 50)

        entries = [Entry(self, font =('Calibri', 7 )) for _ in range(3)]
        for entry in entries:
            #entry.place(x = 400, y = 80)
            entry.pack()

        entries_date = [Entry(self, font =('Calibri', 7 )) for _ in range(3)]
        for entry in entries_date:
            #entry.place(x = 550, y = 80)
            entry.pack()

class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        label = tk.Label(self, text="This is page 2", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)
        button = tk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        button.pack()

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

1 Ответ

0 голосов
/ 11 июля 2019

Если вы пытаетесь создать строки и столбцы, есть два общепринятых способа сделать это:

  1. сделать каждую строку рамкой и упаковать записи вдоль стороны
  2. использовать сетку для создания строк и столбцов.

Первое лучше всего, если ваши столбцы не нуждаются в выравнивании, второе лучше, если ваши столбцы do нуждаются врасстановка.Тем не менее, вы также должны принять во внимание то, что еще вы помещаете в рамку - вы не можете использовать оба grid и pack для виджетов, имеющих один и тот же мастер.

Примечание: Есливы создаете идентичные виджеты в каждой строке, тогда в качестве побочного эффекта столбцы выстраиваются в линию, даже когда вы используете пакет.

Пример использования пакета:

entries = []
entry_frame = Frame(self)
entry_frame.pack(side="top", fill="x")
for column in range(3):
    entry = Entry(entry_frame, font=('Calibri', 7))
    entry.pack(side="left", fill="both", expand=True)
    entries.append(entry)

entries_date = []
entry_date_frame = Frame(self)
entry_date_frame.pack(side="top", fill="x")
for column in range(3):
    entry = Entry(entry_date_frame, font=('Calibri', 7))
    entry.pack(side="left", fill="both", expand=True)
    entries_date.append(entry)

Пример использования сетки:

entries = []
for column in range(3):
    entry = Entry(self, font=('Calibri', 7))
    entry.grid(row=0, column=column, sticky="ew")
    entries.append(entry)

entries_date = []
for column in range(3):
    entry = Entry(self, font=('Calibri', 7))
    entry.grid(row=1, column=column, sticky="ew")
    entries_date.append(entry)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...