Несколько кнопок Tkinter - расположение на холсте

1

Я нашел некоторый код (дополняет переполнение стека), который будет создавать несколько кнопок на холсте. Я хотел бы узнать, как позиционировать тезисы нескольких кнопок в любом месте на холсте, например кнопку кнопки 1 кнопки 2 и т.д. И располагать их в середине холста. Кроме того, если бы я сказал 50 кнопок, как я могу их использовать в формате 10 х 5?

  from tkinter import *
  from tkinter import ttk
  from functools import partial

  root = Tk()
  root.title('test')

  mainframe = ttk.Frame(root, padding='1')
  mainframe.grid(column=0, row=0)

  root.resizable(False, False)                 
  root.geometry('800x400')

  items = [
      {
          'name' : '1',
          'text' : '0000',
      },{
          'name' : '2',
          'text' : '0020',
      },{
          'name' : '3',
          'text' : '0040',
      },
  ]

  rcount = 1 

  for rcount, item in enumerate(items, start=1): 
     ttk.Button(mainframe, text=item['text'], 
  command=partial(print,item['text'])).grid(column=1, row=rcount, sticky=W)

  root.mainloop() 
  • 0
    Ваш первый шаг должен пройти через учебник по tkinter. Stackoverflow не предназначен для бесплатной службы кодирования.
Теги:
python-3.x
tkinter

1 ответ

1
Лучший ответ

Вы create_window() виджеты на холсте с помощью create_window() который принимает координаты x & y, высоту, ширину и ссылку на виджетов (и привязку).

См. Пример ниже:

from tkinter import *
from tkinter import ttk
from functools import partial

root = Tk()
root.title('test')
root.resizable(False, False)
root.geometry('800x400')
root.columnconfigure(0, weight=1)   # Which column should expand with window
root.rowconfigure(0, weight=1)      # Which row should expand with window

items = [{'name' : '1', 'text' : '0000', 'x': 0, 'y': 0},
         {'name' : '2', 'text' : '0020', 'x': 55, 'y': 150},
         {'name' : '3', 'text' : '0040', 'x': 600, 'y': 200}]

canvas = Canvas(root, bg='khaki')   # To see where canvas is
canvas.grid(sticky=NSEW)

for item in items:
    widget = ttk.Button(root, text=item['text'],
                        command=partial(print,item['text']))
    # Place widget on canvas with: create_window
    canvas.create_window(item['x'], item['y'], anchor=NW, 
                         height=25, width=70, window=widget)

root.mainloop()

Чтобы получить кнопки в формате 10 x 5, просто используйте вложенные циклы.

for x in range(10):
    for y in range(5):
        text = str(x) + ' x ' + str(y)
        widget = ttk.Button(root, text=text,
                            command=partial(print,text))
        # Place widget on canvas with: create_window
        canvas.create_window(10+75*x, 10+30*y, anchor=NW, 
                             height=25, width=70, window=widget)

Самый простой способ назвать все кнопки - это, вероятно, сделать словарь, ассоциирующий имя с позицией:

text_dict = {'0 x 0': '0000',
             '1 x 0': '0020'
             # etc, etc.
             }

и затем используйте dict в настройке текста кнопки:

text = text_dict[str(x) + ' x ' + str(y)]
  • 0
    Спасибо !!! Обе части кода работают очень хорошо - для кода с вложенным циклом, как мне заменить текст = str (x) + 'x' + str (y) на элементы в словаре, таким образом, каждый текст кнопки будет 0000 0020 0040 и т.д
  • 0
    Я обновил свой пример.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню