Использование CheckButtons для изменения функций в tkinter для python 3x - PullRequest
0 голосов
/ 05 июля 2019

Я хочу создать простое приложение для игры в кости (персональный проект, чтобы улучшить работу с python), в котором пользователь может выбрать, бросать 6 или 20 кубиков с помощью tkinter.

В основном должно быть 4 виджета: метка (чтобы напечатать результат) кнопка (для запуска функции прокрутки костей) и 2 флажка (чтобы выбрать, какие кости бросить)

поэтому код, который я пробовал, выглядит следующим образом.

from tkinter import *
import tkinter as tk
import random

window = tk.Tk()

def roll():
    if var1 == 1:
        print("your result is " + str(random.randint(1,6)))
    elif var2 == 1:
        print("your result is " +  str(random.randint(1,20)))
    label = tk.Label(canvas, text = roll(), width = 20, font = 40,
                 height = 1)
    label.place(relx=.5, rely = .2,  anchor='n')

var1 = IntVar()
var2 = IntVar()

canvas = tk.Canvas(window, height = 600, width = 300, bg = 'blue').pack()

C1 = Checkbutton(canvas, text = "6", variable = var1.get(),
                 onvalue = 1, offvalue = 0, height=1,
                 width = 10)
C1.place(relx = .01, rely = .7)

C2 = Checkbutton(canvas, text = "20", variable = var2.get(),
                 onvalue = 1, offvalue = 0, height=1,
                 width = 10)
C2.place(relx = .5, rely = .7)

btn = tk.Button(canvas, text = 'roll dem bones!', command = lambda: 
                roll())
btn.place(relx = .5, rely = .9)

window.mainloop()

Пока у меня две проблемы.

1: когда я нажимаю кнопку CheckButton, в обоих случаях появляется галочка, означающая, что оба активируются (возможно, это можно исправить, просто поправившись с помощью tkinter, но если вы заметите проблему, я буду признателен за совет.

2: при нажатии на кнопку появляется ошибка «RecursionError: превышена максимальная глубина рекурсии в сравнении».

Я думаю, проблема в том, что я просто не могу разобраться с вызовом функций таким способом с помощью tkinter. Я на самом деле использую это как упражнение для создания более сложного приложения RPG для использования с некоторыми друзьями, где вы выбираете бонус атрибута, чтобы добавить к броску D20, но я хотел попробовать что-то более простое без остальной части приложение в коде.

Сообщество питонов до сих пор было самым полезным и наименее пренебрежительным из всех групп кодирования, к которым я обращался за помощью, поэтому заранее благодарю за помощь.

Кев.

1 Ответ

1 голос
/ 06 июля 2019

Есть много вещей, которые не так с вашим кодом, но давайте просто сосредоточимся на вопросах, которые вы задали. Первая проблема возникает из-за неправильного использования IntVar: вы создали две IntVar, но вы установили variable ваших кнопок проверки на var1.get(). get - это только метод возврата значения, установленного в IntVar. Чтобы правильно связать переменные:

C1 = Checkbutton(canvas, text = "6", variable = var1,
                 onvalue = 1, offvalue = 0, height=1,
                 width = 10)

То же самое для другой кнопки.

Далее, ошибка исходит от вашей функции roll. Вы создали метку с помощью text=roll(), которая снова выполняет функцию roll, а затем также выполняет себя снова ... что приводит к вашей ошибке maximum recursion.

Чтобы правильно исправить только часть рулона, вы можете определить другую функцию, которая возвращает результат в пределах roll:

def roll():
    def get_result():
        if var1.get() == 1:
            return "your result is " + str(random.randint(1,6))
        elif var2.get() == 1:
            return "your result is " +  str(random.randint(1,20))
    label = tk.Label(canvas, text = get_result(), width = 20, font = 40,
                 height = 1)
    label.place(relx=.5, rely = .2,  anchor='n')

Обратите внимание, что я изменил if var1 == 1: на if var1.get() ==1:, как объяснено ранее.

У вас все еще есть другие проблемы, такие как наложение новых меток при каждом клике, избыточное использование функции lambda, переменная canvas, установленная на None ... но я оставлю их для вас, чтобы вы исправили их самостоятельно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...