在python tkinter中将不同的条目集彼此相邻放置

时间:2019-07-11 12:46:07

标签: python-3.x for-loop tkinter

我在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()

1 个答案:

答案 0 :(得分:0)

如果您尝试创建行和列,则有两种公认的方法:

  1. 使每一行成为一个框架,然后将条目打包在侧面
  2. 使用网格创建行和列。

如果列不需要排队,第一个最好;如果列要做,第二个最好。不过,您还必须考虑要放入框架中的其他内容-您不能在具有相同母版的小部件上同时使用gridpack

注意:如果要在每一行中创建相同的窗口小部件,则副作用是,即使使用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)