Есть ли способ, которым я могу сделать кнопки в Tkinter с помощью цикла for, а также дать каждому отдельную команду? - PullRequest
2 голосов
/ 22 апреля 2019

Я делаю систему ревизий для школы и хочу, чтобы она могла использовать модульное количество предметов на случай, если предмет добавлен в систему, поэтому мне нужен способ сделать несколько кнопок сразличные имена субъектов, и можно различать эти кнопки с помощью tkinter.Так, например, если бы они нажали кнопку «Математика», это привело бы их к другому фрагменту кода, специально предназначенному для математики (хотя это не может быть исключительно для математики, так как тогда мне потребуются определения для предметов, которые недаже было добавлено еще)

Сначала я просто попытался установить команду "print (subjectnames [subcount-1]))", думая, что это напечатало бы имя кнопки, но это просто напечатало оба имени сразудаже не нажимая кнопку.Затем я попытался изменить имя переменной в зависимости от имени кнопки, что я не ожидал сработать, я был просто ошеломлен и отчаялся

Здесь я начал настраивать определение

def chooseQuiz():
    clearWindow()
    subjectnames=[]
    button=[]

Это, вероятно, было неважно, только метки для заголовка и пробела

    Label(mainWindow, text="Which quizzes would you like to take?", bg='purple3', font=('constantia',25,"bold")).grid(row=0, column=0, padx=100, pady=0)
    Label(mainWindow, bg='purple3').grid(row=1, column=0, padx=0, pady=15)

Здесь я извлекаю данные из таблицы SQL, чтобы получить все имена субъектов из всех тем, опять же, вероятно, неважно, но здесь большинствосделаны переменные

    c.execute("SELECT Subject_name FROM topics")
    for row in c.fetchall():
        if row[0] in subjectnames:
            pass
        elif row[0] not in subjectnames:
            subjectnames.append(row[0])
        else:
            messagebox.showerror("Error", "subjectnames are not appending")
            chooseQuiz()

Это основная часть этого вопроса, где я попытался сформировать плавное число кнопок с разными командами, но безрезультатно


    for subcount in range(len(subjectnames)):
        button.append(Button(mainWindow, text=str(subjectnames[subcount-1]), bg='grey', fg='black', font=('cambria',15), width=25, command=(subject==subjectnames[subcount-1])))
        button[-1].grid(row=subcount+2,column=0, padx=0, pady=15)

Iожидалось, что переменная объекта будет такой же, как и нажатая кнопка, но она останется равной 0 (исходное значение).Я думаю, что это связано с неправильным использованием командной функции в tkinter с моей стороны.Кнопки по-прежнему отображались нормально (в настоящее время только 2 предмета, математика и физика, и оба отлично).

1 Ответ

2 голосов
/ 22 апреля 2019

Да, это возможно.

В следующем примере создается окно с кнопкой сброса;после нажатия кнопки сброса кадр заполняется кнопками, соответствующими случайному количеству кнопок, выбранных случайным образом из возможных объектов.У каждой кнопки есть команда, которая вызывает функцию display, которая перенаправляет вызов на соответствующую тему, которая, в свою очередь, печатает название своей темы на консоли, для простоты примера.Вы можете легко создавать функции / классы, соответствующие каждой теме, для инкапсуляции более сложного поведения.

Добавление предметов так же просто, как добавление пары key-value в SUBJECTS

Нажатие reset снова удаляет текущую кнопку и заменяет их новым набором, выбранным случайным образом.

import random
import tkinter as tk
from _tkinter import TclError


SUBJECTS = {'Maths': lambda:print('Maths'), 
            'Physics': lambda:print('Physics'),
            'Chemistry': lambda:print('Chemistry'),
            'Biology': lambda:print('Biology'),
            'Astronomy': lambda:print('Astronomy'),
            'Petrology': lambda:print('Petrology'),}

topics = []


def topic_not_implemented():
    print('this topic does not exist')


def get_topics():
    """randomly creates a list of topics for this example
    """
    global topics
    topics = []
    for _ in range(random.randrange(1, len(SUBJECTS))):
        topics.append(random.choice(list(SUBJECTS.keys())))
    return topics


def reset_topics():
    global topics_frame

    try:
        for widget in topics_frame.winfo_children():
            widget.destroy()
        topics_frame.forget()
        topics_frame.destroy()
    except UnboundLocalError:
        print('error')
    finally:
        topics_frame = tk.Frame(root)
        topics_frame.pack()
    for topic in get_topics():
        tk.Button(topics_frame, text=topic, command=lambda topic=topic: display(topic)).pack()


def display(topic):
    """redirects the call to the proper topic
    """
    SUBJECTS.get(topic, topic_not_implemented)()


root = tk.Tk()
reset = tk.Button(root, text='reset', command=reset_topics)
reset.pack()
topics_frame = tk.Frame(root)
topics_frame.pack()
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...