Проблема с размещением виджетов рядом друг с другом с помощью tkinter

Итак, у меня есть этот кусок кода:

import tkinter as tk

root = tk.Tk()
root.geometry("400x300")
root.columnconfigure(0, weight=1, minsize=75)
root.rowconfigure(0, weight=1, minsize=50)

subjects = ["None"]

frm_new_grade = tk.Frame()
lbl_new_grade = tk.Label(text = "New Grade", font = "System")
lbl_add_subject = tk.Label(frm_new_grade, text = "Subject:", font = "System")
lbl_add_subject.grid(row=0, column=0, sticky = "E")
subject_value = tk.StringVar(frm_new_grade)
subject_value.set("Select an Option")
question_menu = tk.OptionMenu(frm_new_grade, subject_value, *subjects)
question_menu_menu = root.nametowidget(question_menu.menuname)
question_menu_menu.config(font = "System")
question_menu.config(font = "System")
question_menu.grid(row=0, column=1, sticky = "W")
btn_new_subject = tk.Button(frm_new_grade, text = "+", font = "System", width=2)
btn_new_subject.grid(row=0, column=2, padx=5, sticky = "W")
lbl_add_grade = tk.Label(frm_new_grade, text = "Grade:", font = "System")
lbl_add_grade.grid(row=1, column=0, sticky = "E")
ent_add_grade = tk.Entry(frm_new_grade, font = "System", width=18)
ent_add_grade.grid(row=1, column=1, columnspan=2, sticky = "W")
btn_add_grade = tk.Button(frm_new_grade, text = "Add Grade", font = "System")
btn_add_grade.grid(row=2, column=1, sticky = "W", pady=5)

frm_new_grade.grid()

root.mainloop()


Моя проблема в том, что я хочу, чтобы btn_new_subject всегда был рядом с question_menu, например, когда у question_menu есть «Выбрать вариант», но не так, когда я выбираю «Нет».

Я пытался исправить это, используя columnspan на ent_add_grade (как вы видите в моем коде), я думал, что это со свойствами stickybtn_new_subject сделает так, чтобы они были рядом друг с другом, но вместо этого я получаю btn_new_subject, как будто это не имел sticky собственности.

Я новичок в программировании и python, поэтому любые отзывы будут оценены.

«Моя проблема в том, что я хочу, чтобы btn_add_subject был» — нет ничего с именем btn_add_subject. Вы имели в виду btn_new_subject или btn_add_grade?

Bryan Oakley 18.02.2023 01:31

о, мне ужасно жаль, да, я имел в виду btn_new_subject

MatiB_ 18.02.2023 22:50

Замените sticky = "W" на sticky = "EW" в question_menu.grid(...).

acw1668 20.02.2023 05:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете просто установить sticky = "EW" в question_menu.grid(...), чтобы question_menu заполнило пространство по горизонтали в ячейке.

Результат:

  • Для lbl_new_grade.grid() отсутствует опечатка
  • В строке 12 добавьте корень для lbl_new_grade(frm_new_grade,
  • Установите все row=x, column=0. X обозначает 1, 2 и 3. В то время как row=2
    столбец = 1. And for btn_add_grade.grid (строка = 3, столбец = 1
  • Если вам нравится макет для root.geometry("235x150")
  • Если вам нравится без глюков для макета. Затем установите индекс на 1 root.columnconfigure(1,

Вам решать.

Фрагмент для удобства чтения:

import tkinter as tk

root = tk.Tk()
root.geometry("235x150")
root.columnconfigure(0, weight=1, minsize=75)
root.rowconfigure(3, weight=1, minsize=50)

subjects = ["None"]

frm_new_grade = tk.Frame()

lbl_new_grade = tk.Label(frm_new_grade,  text = "New Grade", bg='red', font = "System")
lbl_new_grade.grid(row=0, column=1)

lbl_add_subject = tk.Label(frm_new_grade, text = "Subject:", font = "System")
lbl_add_subject.grid(row=1, column=0, sticky = "WE", pady=10)

subject_value = tk.StringVar(frm_new_grade)
subject_value.set("Select an Option")

question_menu = tk.OptionMenu(frm_new_grade, subject_value, *subjects)
question_menu_menu = root.nametowidget(question_menu.menuname)
question_menu_menu.config(font = "System")
question_menu.config(font = "System")
question_menu.grid(row=1, column=1, sticky = "WE")

btn_new_subject = tk.Button(frm_new_grade, text = "+", font = "System", width=2)
btn_new_subject.grid(row=1, column=2, padx=5, sticky = "WE")

lbl_add_grade = tk.Label(frm_new_grade, text = "Grade:", font = "System")
lbl_add_grade.grid(row=2, column=0, sticky = "W")

ent_add_grade = tk.Entry(frm_new_grade, font = "System", width=18)
ent_add_grade.grid(row=2, column=1, columnspan=2, sticky = "W")

btn_add_grade = tk.Button(frm_new_grade, text = "Add Grade", font = "System")
btn_add_grade.grid(row=3, column=1, sticky = "W", pady=5)

frm_new_grade.grid()

root.mainloop()

Скриншот:

Другие вопросы по теме