Grid и Pack конфликтуют, несмотря на то, что находятся в разных кадрах - PullRequest
0 голосов
/ 01 марта 2019

Я создаю приложение, которое использует смесь кадров, чтобы помочь с организацией.Я использую всего 3, и они упакованы слева, справа и сверху.Затем я изначально использовал сетку для организации виджетов внутри них.Однако субфрейм, который я упаковал справа, был упакован поверх другого субфрейма, который был упакован сверху.Я не знаю, почему это произошло.Однако я попытался использовать pack внутри одного из подкадров, чтобы сделать его более простым.Затем я столкнулся с этой ошибкой:

Traceback (most recent call last):
  File "E:/Python/Py_Proj/Attempt at treeview.py", line 78, in <module>
    app = App(window)
  File "E:/Python/Py_Proj/Attempt at treeview.py", line 42, in __init__
    self.Banner_Label.grid(row=0,column=0)
  File "C:\Users\Green\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 2223, in grid_configure
    + self._options(cnf, kw))
_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack

Вот код:

import tkinter as tk
from tkinter import ttk

user_list = [("foo", 3), ("bar", 3), ("Terri", 2), ("Chris", 2),
             ("Tony", 2), ("Emma", 2), ("Thomas", 1), ("Penny", 1),
             ("Kamryn", 1), ("Kelsie", 1), ("James", 1), ("Connor", 1),
             ("Steve", 1), ("Bob", 2), ("Elon", 1), ("Albert", 1),
             ("Brian", 1), ("Sam", 1), ("Karen", 1), ("Sophie", 1),
             ("Leo", 1), ("Alfie", 1), ("Alan", 1), ("Turing", 3),
             ("Reeves", 2), ("Greene", 2), ("Seal", 2), ("Keeble", 1),
             ("Bailey", 1), ("Kaey", 1), ("Joe", 1), ("Lauren", 1),
             ("Lasagna", 1), ("Morris", 1), ("Quinn", 1), ("Mitchell", 2)]

class App(tk.Frame):
    def __init__(self,master):
        tk.Frame.__init__(self,master)
        self.master = master

        # Tree Frame
        self.Tree_Frame = tk.Frame(self, width=200, height=200).pack(side=tk.LEFT)
        self.Tree = ttk.Treeview(self.Tree_Frame, columns=("a", "b"))
        self.Tree['show'] = 'headings'
        self.Tree["columns"] = ("User", "Clearance")
        self.Tree.heading("User", text="Name")
        self.Tree.heading("Clearance", text="Clearance")
        self.Tree.column("User", width=100, anchor="center")
        self.Tree.column("Clearance", width=80, anchor="center")


        # Func Frame
        self.Func_Frame = tk.Frame(self, width=200, height=200).pack(side=tk.RIGHT)
        self.Func_Title_Var = tk.StringVar()
        self.Func_Title = ttk.Label(self.Func_Frame, textvariable=self.Func_Title_Var).pack()
        self.Func_Entry_Var = tk.StringVar()
        self.Func_Entry_Box = ttk.Entry(self.Func_Frame, textvariable=self.Func_Entry_Var).pack()
        self.Func_Text_Box = tk.Text(self.Func_Frame, width=20, height=3).pack()
        self.Func_Submit = ttk.Button(self.Func_Frame, text="Submit", command=lambda: print("Submit_Button")).pack()

        # Banner Frame
        self.Banner_Frame = tk.Frame(self,width=200,height=200).pack(side=tk.TOP)
        self.Banner_Label = ttk.Label(self.Banner_Frame,text="AssignmentPage")
        self.Banner_Label.grid(row=0,column=0)
        self.Banner_Reset = ttk.Button(self.Banner_Frame,text="Reset",
                                       command=lambda: print("Reset_Button"))
        self.Banner_Reset.grid(row=0,column=1)
        self.Banner_Back = ttk.Button(self.Banner_Frame, text="Back",
                                      command=lambda:print("Back_Button"))
        self.Banner_Back.grid(row=0, column=2)
        self.Banner_Add = ttk.Button(self.Banner_Frame,text="Add Assignment",
                                     command=lambda:print("Add_Assignment"))
        self.Banner_Add.grid(row=1,column=0)
        self.Banner_Edit = ttk.Button(self.Banner_Frame,text="Edit Assignment",
                                      command=lambda: print("Edit_Assignment"))
        self.Banner_Edit.grid(row=1,column=1)
        self.Banner_Remove = ttk.Button(self.Banner_Frame,text="Delete Assignment",
                                        command=lambda: print("Delete_Assignment"))
        self.Banner_Remove.grid(row=1,column=2)

        for user in user_list:
            self.Tree.insert("", "end", values=user)
        self.Tree.bind("<ButtonRelease-1>", self.Select_Item)
        self.Tree.pack()

    def Select_Item(self,event):
        Current_Item = self.Tree.item(self.Tree.focus())
        Row_Value = Current_Item["values"]
        print("Row_Value =",Row_Value)


if __name__ == "__main__":
    window = tk.Tk()
    app = App(window)
    window.mainloop()

1 Ответ

0 голосов
/ 01 марта 2019

Проблема в следующей строке:

self.Banner_Frame = tk.Frame(self,width=200,height=200).pack(side=tk.TOP)

Вам нужна ссылка на виджет баннера, которая должна быть:

self.Banner_Frame = tk.Frame(self,width=200,height=200)
self.Banner_Frame.pack(side=tk.TOP)

То, что вы делаете сейчас, проходит None как мастер ваших виджетов.

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

self.Tree_Frame = tk.Frame(master, width=200, height=200)
....
self.Func_Frame = tk.Frame(master, width=200, height=200)
....
self.Banner_Frame = tk.Frame(master,width=200,height=200)

или, альтернативно, просто наберите self.pack().

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