Я использую фрейм 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()