Не удается получить содержимое виджета Entry с помощью input()

Я пытаюсь написать простой графический интерфейс Python в Windows 8.1 с использованием Python 3.4.2.
Я пытаюсь создать программу для расчета концентрации (молярность = моль/литр), но в графическом интерфейсе я создаю. Ответ не отображается в Текстовый виджет, но числа отображаются в командной оболочке.
Вычисления также не работают, потому что, когда я оставил запись пустой, что-то вычислялось (что должно быть невозможно, даже если пустые записи будут оценены как 0, это не должно иметь возможность делить на 0) и это дает мне эти числа .56494480.56494448.

думаю проблема именно в этой части

def mol(self):
    moli = float(input(self.grammi)) / float(input(self.peso_molecolare))
    self.text.delete(0.0, END)
    self.text(0.0, moli)


def mola(self):
    conc = float(float(input(self.grammi)/ float(input(self.peso_molecolare))) / float(input(self.litri))

    self.text.delete(0.0, END)
    self.text.insert(0.0, conc)

Если вам нужен весь код, вот он

from tkinter import *


class Application(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        self.instuction = Label(self, text="inserisci i seguenti dati")
        self.instuction.grid(row=0, column=0, columnspan=2, sticky=W)
        self.grammi = Entry(self)
        self.grammi.label = Label(self, text="grammi")
        self.grammi.grid(row=1, column=1, sticky=W)
        self.grammi.label.grid(row=1, column=0, sticky=W)
        self.peso_molecolare = Entry(self)
        self.peso_molecolare.label = Label(self, text="peso molecolare")
        self.peso_molecolare.grid(row=2, column=1, sticky=W)
        self.peso_molecolare.label.grid(row=2, column=0, sticky=W)
        self.litri = Entry(self, text="litri")
        self.litri.label = Label(self, text="litri")
        self.litri.grid(row=3, column=1, sticky=W)
        self.litri.label.grid(row=3, column=0, sticky=W)

        self.moli_button = Button(self, text="calcolo moli", command=self.mol)
        self.moli_button.grid(row=2, column=2, sticky=W)
        self.conc_button = Button(self, text="concentrazione", command=self.mola)
        self.conc_button.grid(row=3, column=2, sticky=W)
        self.exit_button = Button(self, text="Exit", command=self.close_window)
        self.exit_button.grid(row=4, column=2, sticky=W)

        self.text = Text(self, width=35, height=5, wrap=NONE)
        self.text.grid(row=4, column=0, columnspan=2, sticky=W)

    def mol(self):
        moli = float(input(self.grammi)) / float(input(self.peso_molecolare))
        self.text.delete('1.0', END)
        self.text.insert('1.0', moli)


    def mola(self):
        conc = float(float(input(self.grammi)) / float(input(self.peso_molecolare))) / float(input(self.litri))
        self.text.delete('1.0', END)
        self.text.insert('1.0', conc)

    def close_window(self):
        root.destroy()


root = Tk()
root.title("chimica")
root.geometry("400x200")
app = Application(root)
root.mainloop()

person Mirkovich    schedule 28.04.2015    source источник
comment
Вы используете wxPython?   -  person ρss    schedule 28.04.2015
comment
Пожалуйста, предоставьте больше кода и больше контекста. Выстрел, работающий пример с объяснением того, что вы ожидаете, позволит ответить на ваш вопрос. Кроме того, похоже, вы используете Tkinter. Если это правда, вы должны пометить свой вопрос соответствующим образом.   -  person Steven Rumbalski    schedule 28.04.2015
comment
Я проголосовал за то, чтобы закрыть как неясно, что вы спрашиваете, потому что вы не улучшили свой вопрос.   -  person Steven Rumbalski    schedule 28.04.2015
comment
Python 3.4.2 для победы в Windows 8.1   -  person Mirkovich    schedule 30.04.2015


Ответы (2)


С Tkinter, чтобы получить значение, вставленное в виджет Entry, вы не должны использовать input< /a>, но вы должны использовать метод get, например:

moli = float(self.grammi.get()) / float(self.peso_molecolare.get())

то же самое касается conc:

conc = float(self.grammi.get()) / float(self.peso_molecolare.get()) / float(self.litri.get())

У вас есть проблема в том, что input будет запрашивать ввод данных пользователем в командной оболочке после того, как задаст вопрос, заключенный в круглые скобки. Однако вы помещаете туда ссылку на виджет Entry. То, что напечатано (.56494480 и .56494448), является внутренними ссылками на эти виджеты, а не результатами каких-либо вычислений.

person fhdrsdg    schedule 30.04.2015

Я должен предположить, что вы используете Tkinter. Возможно, номера строк начинаются с 1, а вы вставляете в строку 0. Кроме того, индексы — это строки, а не числа с плавающей запятой.

Попробуйте изменить код на:

def mol(self):
    moli = float(input(self.grammi)) / float(input(self.peso_molecolare))
    self.text.delete('1.0', END)
    self.text.insert('1.0', moli)

def mola(self):
    conc = float(float(input(self.grammi)) / float(input(self.peso_molecolare))) / float(input(self.litri))
    self.text.delete('1.0', END)
    self.text.insert('1.0', conc)

Или вы можете просто использовать self.text.insert(INSERT, conc), который будет вставлен в текущую точку вставки.

person mhawke    schedule 28.04.2015
comment
Кажется, что Tkinter более снисходителен к индексам, чем задокументировано, но, по крайней мере, теперь ваш код соответствует документации. Я думаю, что ответ fhdrsdg's правильный - вам нужно использовать .get(), а не input(). - person mhawke; 30.04.2015
comment
Хотя это не решает проблему, вы делаете очень верное наблюдение. Текстовые индексы должны быть строками, а не числами с плавающей запятой. Это вызвало большую путаницу потому что в некоторых случаях они работают, но не работают во многом другом. - person fhdrsdg; 30.04.2015