在我的以下代码中,在顶层窗口中,我无法正确修复小部件并具有美观的外观。
我收到以下错误。 你能帮我优化一下代码吗?
部分代码:
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
调整大小,并保持干净的外观。
在那部分你已经使用了 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'))