如何在 tkinter python3 中修复/放置小部件?

问题描述 投票:0回答:1

在我的以下代码中,在顶层窗口中,我无法正确修复小部件并具有美观的外观。

我收到以下错误。 你能帮我优化一下代码吗?

部分代码:

def _setup_widgets(self):
        s = """click on titles to sort"""
        msg = ttk.Label(wraplength="2i", justify="right", anchor="n",
            padding=(10, 2, 10, 6), text=s , font=('title','10'))
        msg.pack(fill='x', padx=15, pady=10)
        container = ttk.Frame()
        container.pack(side="left",fill='both', expand=True)
        self.tree = ttk.Treeview(columns=header, show="headings",)
        vsb = ttk.Scrollbar(orient="vertical",
            command=self.tree.yview)
        hsb = ttk.Scrollbar(orient="horizontal",
            command=self.tree.xview)
        self.tree.configure(yscrollcommand=vsb.set,
            xscrollcommand=hsb.set)
        self.tree.grid(column=0, row=0, sticky='nsew', in_=container)
        vsb.grid(column=1, row=0, sticky='ns', in_=container)
        hsb.grid(column=0, row=1, sticky='ew', in_=container)
        container.grid_columnconfigure(0, weight=1)
        container.grid_rowconfigure(0, weight=1)

        # Add buttons for adding and removing
        ttk.Button(container, text="Add Products", command=self._add_item_window).grid(row=2, column=0, sticky=('nsew'), padx=2, pady=2)
        ttk.Button(container, text="Remove Selected", command=self._remove_item).grid(row=2, column=1, sticky=('nsew'), padx=2, pady=2)
        ttk.Button(container, text="Account").grid(row=3, column=0, sticky=('nsew'), padx=2, pady=2)
        ttk.Button(container, text="Setting").grid(row=5, column=0, sticky=('nsew'), padx=2, pady=2)
        ttk.Button(container, text="Edit Selected").grid(row=3, column=1, sticky=('nsew'), padx=2, pady=2)
        ttk.Button(container, text="").grid(row=5, column=1, sticky=('nsew'), padx=2, pady=2)
#................................................................................................................

    def _build_tree(self):
        for col in header:
            self.tree.heading(col, text=col.title(),
                command=lambda c=col: sortby(self.tree, c, 0))
            # adjust the column's width to the header string
            self.tree.column(col,
                width=tkFont.Font().measure(col.title()))
            
        for item in product_list:           
            item_data = list(item)
            # Add a button to each row
            self.tree.insert('', 'end', values=item_data,tag='blue')               
          
            # adjust column's width if necessary to fit each value
            for ix, val in enumerate(item_data):
                col_w = tkFont.Font().measure(val)
                if self.tree.column(header[ix], width=None) < col_w:
                    self.tree.column(header[ix], width=col_w)
#................................................................................................................
    
    def _add_item_window(self):
        add_window = tk.Toplevel()
        add_window.title('Add New Product')
        add_window.geometry('500x300')  # Adjusted for better geometry 
        add_window.resizable(True, True)
        # add_window.minsize(500,300)
        # add_window.maxsize(600,350)
        # Frame for better organization and padding
        form_frame = ttk.Frame(add_window, padding='10 10 10 10')
        form_frame.grid(column=0, row=0, sticky=('nsew'))
        add_window.columnconfigure(0, weight=1)
        add_window.rowconfigure(0, weight=1)
        form_frame.columnconfigure(0, weight=1)  # Make the form_frame column expandable
        form_frame.rowconfigure(0, weight=1)  # Make the form_frame row expandable

        ttk.Label(form_frame, text='Enter ID:').grid(row=0, column=0, sticky=('ew'))
        url_entry = ttk.Entry(form_frame, width=50)
        url_entry.grid(row=1, column=0, sticky=('nsew'))

        self.persian_font = create_persian_font()
        self.name_string_var = tk.StringVar(add_window, value='name will display!')
        ttk.Button(form_frame, text='Check', command=lambda: self.populate_colors(url_entry)).grid(row=2, column=0, pady=5, sticky=('ew'))
        ttk.Label(form_frame, textvariable=self.name_string_var,foreground='green',anchor='e',font=self.persian_font, justify='right').grid(row=3, column=0, sticky=('nsew'))
        ttk.Label(form_frame, text='select Color:').grid(row=4, column=0, sticky=('ew'))

        n = tk.StringVar()      
        self.color_combo = ttk.Combobox(form_frame, values=[], width=47, textvariable=n)  
        self.color_combo.grid(row=5, column=0, sticky=('ew'))

       # Frame for displaying prices
        
        ttk.Label(form_frame, text='Price:').grid(row=6, column=0, sticky=('ew'))
        self.prices_text = tk.Text(form_frame, height=1, width=2,font=('15'),fg='green')
        self.prices_text.grid(row=7, column=0, sticky=('ew'))

        # Number Selectiongrid
        ttk.Label(form_frame, text='Number:').grid(row=8, column=0, sticky=('ew'), pady=5)
        self.spinbox = ttk.Spinbox(form_frame, from_=0, to=30, width=48)
        self.spinbox.grid(row=9, column=0, sticky=('ew'), pady=5)

        tk.Label(form_frame, text="Min:").grid(row=10, column=0, pady=5, sticky=('ew'))
        min_val=tk.Entry().grid(row=11, column=0, pady=5, sticky=('ew'))
        tk.Label(form_frame, text="Max:").grid(row=12, column=0, pady=5, sticky=('ew'))
        m_val=tk.Entry().grid(row=13, column=0, pady=5, sticky=('ew'))
        # min_val = int(min_entry.get())
        # max_val = int(max_entry.get())
        # Add Button
        add_button = ttk.Button(form_frame, text='ADD', command=lambda: self._addd(add_window))
        add_button.grid(row=12, column=0, pady=5, sticky=('ew'))

        self.color_combo.bind("<<ComboboxSelected>>", self.update_text)
        # Adjust the window’s row and column configurations for uniform spacing

        for child in form_frame.winfo_children():
            child.grid_configure(padx=2, pady=2)

        form_frame.pack(fill='both', expand=True)

我的错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\mehrab\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1967, in __call__      
    return self.func(*args)
           ^^^^^^^^^^^^^^^^
  File "d:\projects\1\main_project.py", line 118, in _add_item_window
    min_val=tk.Entry().grid(row=11, column=0, pady=5, sticky=('ew'))
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\mehrab\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2569, in grid_configure
    self.tk.call(
_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack

我正在尝试修复/放置小部件并在表单中显示所有小部件。 我希望

form_frame
和小部件能够沿着
add_new_window
调整大小,并保持干净的外观。

python-3.x tkinter tkinter-entry customtkinter tkinter-layout
1个回答
0
投票

在那部分你已经使用了 pack。之后,在 min_val 和 m_val 中,你尝试对它们进行网格化。 Tkinter 不允许在同一帧中使用不同的打包选项。

msg = ttk.Label(wraplength="2i", justify="right", anchor="n",
        padding=(10, 2, 10, 6), text=s , font=('title','10'))
    msg.pack(fill='x', padx=15, pady=10)

因此,对于您的代码,您需要将它们更改为行,并添加框架。

    min_val=tk.Entry().grid(row=11, column=0, pady=5, sticky=('ew'))
    m_val=tk.Entry().grid(row=13, column=0, pady=5, sticky=('ew'))

将该部分更改为。所以,你的问题将会得到解决。

    min_val=tk.Entry(form_frame).grid(row=11, column=0, pady=5, sticky=('ew'))
    m_val=tk.Entry(form_frame).grid(row=13, column=0, pady=5, sticky=('ew'))
© www.soinside.com 2019 - 2024. All rights reserved.