我在python中使用Tkinter框架,并且在其中一个页面上我需要显示2组条目,一组彼此相邻,其中条目的数量等于范围内的数量(在完整程序中为一个不断变化的变量,因此每次条目数都会发生变化)。我用for循环来做。
但是,当我尝试将条目打包到框架中时,将2组3个条目显示在6个条目的一列中,而不是显示2列,每个条目具有3行。
如果我将包装调整到框架的左侧和右侧,则每组条目将显示为1行,并具有3列,这是不必要的。
当我使用.place或.grid而不是.pack时,则对于每个集合仅显示一个条目(我想所有3个条目都只是放置在单个定义的位置,例如(x = 550,y = 80 ),因此3个条目“重叠”成一个)
我想我需要编写一个更复杂的“ for循环”功能,并使用.grid或.place定位,以便将所有3个条目依次显示在列中。
或者我也正在考虑使用.pack并将条目插入第一个框架内的新框架中,然后将这两个框架彼此相邻放置可能会起作用。但是再次,我尝试在首页内创建一个额外的框架,但是它没有用。
任何观察和提示将不胜感激!
这是完整的代码,因此您可以尝试使用它来查看整个图片。 (对不起,进口一团糟,我也必须解决这个问题)
P.S。它是较大代码的一部分,在这里我需要使用超过一页的内容,因此该代码是最小的代码-如果程序中只有一帧,则将条目排列为我需要。问题是我不知道如何安排这种特殊的结构。
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()
答案 0 :(得分:0)
如果您尝试创建行和列,则有两种公认的方法:
如果列不需要排队,第一个最好;如果列要做,第二个最好。不过,您还必须考虑要放入框架中的其他内容-您不能在具有相同母版的小部件上同时使用grid
和pack
。
注意:如果要在每一行中创建相同的窗口小部件,则副作用是,即使使用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)