Уведомления

Группа в Telegram: @pythonsu

#1 Июль 18, 2016 14:33:26

Santik
Зарегистрирован: 2016-07-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter

Здравствуйте!
Отдельную ветку для новичков по гуи не нашел, поэтому пишу сюда, вроде не ошибся.
Вопрос следующий: недавно начал изучать гуи (да и питон, впрочем, тоже). Прочитал до определенного момента Доусона, решил закрепить знания, придумал сам себе задачку.
Суть задачи: Есть поля, куда мы вводим сумму, у нас имеющуюся, а так же что хотим купить и почем.
В общем, что то даже написал, но вот сумму затрат вывести как - не понимаю. Если не прописывать отдельно int() - он проводит, соответственно, конкатенацию чисел как строк. Если прописывать, выдает value ошибку.

 from tkinter import *

class Finance(Frame):
def __init__(self, master):
super(Finance, self).__init__(master)
self.grid()
self.operation()
self.math()

def operation(self):

self.your_money_text = Label(self, text = 'Ваши средства').grid(row=0, column=0, sticky =W)
self.your_money = Entry(self)
self.your_money.grid(row=0, column=1, columnspan=2, sticky=W)

self.your_expenses2_text = Label(self, text = 'Ваши потенциальные траты').grid(row = 2, column =0, sticky =W)
self.your_expenses2 = Entry(self)
self.your_expenses2.grid(row =2, column=1, sticky=W)

self.your_buy_text = Label(self, text='Ваша покупка?').grid(row=2, column=2, sticky=W)
self.your_buy = Entry(self).grid(row=2, column=3)

self.your_expenses_text = Label(self, text='Ваши потенциальные траты')
self.your_expenses.grid(row=4, column=0, sticky=W)
self.your_expenses = Entry(self).grid(row=4, column = 1)

self.your_buy_text = Label(self, text='Ваша покупка?').grid(row=4, column=2, sticky=W)
self.your_buy = Entry(self).grid(row=4, column=3, sticky =W)

self.result = Text(self, width=5, height=5, wrap=WORD)
self.result.grid(row=7, column=0, sticky=W)


self.but = Button(root, text='click me', command=self.math).grid(row=6, columnspan=4, sticky=W)

def math(self):
a = self.your_money.get()
b = self.your_expenses2.get()
c = int(a) + int(b)
self.result.delete(0.0, END)
self.result.insert(0.0, c)

root = Tk()
root.title('Программа1')
root.geometry('500x500')
manager = Finance(root)
root.mainloop()
Подскажите, пожалуйста, что не так делаю?
Спасибо!

ПС Я так понимаю, это можно было сделать проще, не прибегая к классам, но раз уж начал учить по учебнику, а так юзаются классы - то и я решил делать так же.

Офлайн

#2 Июль 18, 2016 16:22:21

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

tkinter

Тут несколько ошибок.
1. Вы в __init__ зачем-то запускаете функцию-обработчик события math. Зачем, остается загадкой
2. Если поле пустое, то int(xxx.get()) выдаст ошибку.
Для проверки пропринтуйте переменные:

 def math(self):
        a = self.your_money.get()
        b = self.your_expenses2.get()
        print(a, b)

Офлайн

#3 Июль 18, 2016 17:30:46

Santik
Зарегистрирован: 2016-07-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

tkinter

4kpt_IV
Тут несколько ошибок.1. Вы в __init__ зачем-то запускаете функцию-обработчик события math. Зачем, остается загадкой 2. Если поле пустое, то int(xxx.get()) выдаст ошибку.Для проверки пропринтуйте переменные:
Большое спасибо! Закомментировав math в __init__ исправил ошибку.
И даже, кажется дошло почему))) Если в __init__ math есть - то, если я все правильно понял про инит, то функция-обработчик запускается сразу, не дав заполнить поля, т.о они становятся пустыми и дает ошибку.
Еще раз спасибо.

Отредактировано Santik (Июль 18, 2016 17:30:55)

Офлайн

#4 Июль 18, 2016 17:57:22

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

tkinter

Вы все правильно поняли. Да. Метод __init__ выполняется при инициализации экземпляра класса. В Вашем случае в строке

Santik
manager = Finance(root)

Естественно, что на момент инициализации поля пустые.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version