TypeError: объект «NoneType» не может быть вызван с помощью tkinter

Я пытаюсь сделать программу, которая будет воспроизводить звуки при нажатии кнопки. Но у меня проблемы с вызовом функции. Что я хочу сделать, так это нажать кнопку LowC (или любую другую заметку), и она перейдет к LowC (или соответствующей функции заметки), а затем перейдет к функции Launch, чтобы инициировать звук. Вместо этого он дает мне ошибку "Nonetype". Я не знаю, что не так. Я попытался заменить this.Launch() на это. Запустите, но тогда он не выполняет функцию запуска, как я пробовал это. Запуск (это), но тогда он все равно не работает. Любая помощь?

from tkinter import *
import winsound
import msvcrt as m

class Application(Frame):
    def __init__(this, master):
        Frame.__init__(this, master)
        this.grid()
        this.create()


    def create(this):
        test = m.kbhit()
        if test == True:
            print('test is true')
        this.sound1 = IntVar()
        this.dir = Label(this, text = "Click a button to play a sound")
        this.dir.grid(row = 1, column = 0, columnspan = 5, sticky = W)

        #Create buttons for Notes
        this.LowC = Button(this,
                           text = "Low C",
                           command = this.LowC,
                           ).grid()
        this.D = Button(this,
                           text = "D",
                           command = this.D,
                           ).grid()
        this.E = Button(this,
                           text = "E",
                           command = this.E,
                           ).grid()
        this.F = Button(this,
                           text = "F",
                           command = this.F,
                           ).grid()
        this.G = Button(this,
                           text = "G",
                           command = this.G,
                           ).grid()

        #create launch button
        this.Launch = Button(this,
                           text = "Launch",
                           command = this.Launch,
                           ).grid()

        #create sound length slider
        this.TIME = Scale(this,
                          orient = HORIZONTAL,
                          length = 400,
                          width = 20,
                          sliderlength = 10,
                          from_=0,
                          to = 5000,
                          tickinterval = 500,
                          variable = this.sound1 
                          ).grid()
        #Keypress



    #create freq conversion
    def LowC(this):
        this.freq = 262
        print(this.freq)
        this.Launch()


    def D(this):
        this.freq = 294
        print(this.freq)

    def E(this):
        this.freq = 330
        print(this.freq)

    def F(this):
        this.freq = 349
        print(this.freq)

    def G(this):
        this.freq = 392
        print(this.freq)

    #initiate beep
    def Launch(this):
        winsound.Beep(this.freq, this.sound1.get())
        print('Tada!')
        return


base = Tk()
base.title("Basic Program Outline")
base.geometry("500x500")

app = Application(base)

base.mainloop()

person user3653827    schedule 19.05.2014    source источник
comment
Вам нужно будет включить полную трассировку вашего исключения.   -  person Martijn Pieters    schedule 19.05.2014
comment
Ваше использование this в качестве первого аргумента для методов технически правильно, но обратите внимание, что подавляющее большинство кода Python использует self для этого параметра.   -  person Martijn Pieters    schedule 19.05.2014
comment
У вас есть как метод класса Launch, так и атрибут экземпляра Launch. Последнее маскирует первое, вы не можете иметь оба. То же самое относится к вашему методу LowC и кнопке.   -  person Martijn Pieters    schedule 19.05.2014
comment
Нет необходимости редактировать ваш вопрос после того, как он будет решен. На самом деле лучше не редактировать его, если решение содержится в одном из ответов. Просто примите ответ, который решил вашу проблему, нажав на соответствующую галочку.   -  person John Y    schedule 20.05.2014
comment
Хорошо, спасибо за совет. Я просто привык к другим форумам, где они хотят, чтобы вы написали решённую проблему.   -  person user3653827    schedule 20.05.2014


Ответы (1)


У вас есть и атрибут, и метод с именем LowC.

this.LowC = Button(this,
                   text = "Low C",
                   command = this.LowC,
                   ).grid()
...

#create freq conversion
def LowC(this):
    this.freq = 262
    print(this.freq)
    this.Launch()

Вы должны переименовать один из них.

Кстати, если вы сделаете self.some_name = Button(args).grid(), то self.some_name будет None, потому что вы присваиваете переменной результат grid, а не экземпляр Button, который вам нужен.

person Kevin    schedule 19.05.2014
comment
То же самое для Launch и буквенных кнопок. - person Martijn Pieters; 19.05.2014
comment
Однако я все еще раздумывал, как это может привести к исключению TypeError: 'NoneType' is not callable. - person Martijn Pieters; 19.05.2014
comment
Ах, да, цепочка .grid() звонка. - person Martijn Pieters; 19.05.2014
comment
Если бы он добавил () в this.Launch в кнопку запуска #create, он бы вызвал метод, так как он вызывает, ничего не делает при нажатии LowC - person Padraic Cunningham; 19.05.2014
comment
После дальнейшего изучения единственным атрибутом, который должен быть переименован, является Launch. Все остальные кнопки указывают на соответствующие методы, несмотря на конфликт имен. Launch особенный, потому что на самом деле он вызывается в LowC. - person Kevin; 19.05.2014
comment
Большое спасибо за быструю и полезную помощь! Я прошел и переименовал все кнопки в this.(Примечание) B, а также в this.LaunchB, чтобы они не конфликтовали с методами, как вы, ребята, сказали! И теперь это работает! :D - person user3653827; 19.05.2014
comment
@ user3653827, рад был помочь! Не стесняйтесь принять мой ответ, если считаете, что он был вам полезен . :-) - person Kevin; 20.05.2014