Почему моя программа wx Python не работает? (Код внутри) - PullRequest
0 голосов
/ 27 марта 2020

Итак, я должен написать калькулятор ИМТ. Я не могу заставить его работать, хотя.

До того, как я добавил класс и методы, он работал нормально, но чтобы заставить кнопку Compute работать, мне пришлось использовать класс. И как только я это сломал.

Можете ли вы сказать мне, что я делаю неправильно?

import wx


class BMI(wx.Frame):

def InitUI(self):
    window = wx.Frame(self, title="wx.SpinCtrl", size=(400, 300))
    panel = wx.Panel(window)
    label = wx.StaticText(panel, label="Body Mass Index", pos=(20, 10))
    self.weight = wx.StaticText(panel, label="weight:", pos=(20, 70))
    self.height = wx.StaticText(panel, label="height:", pos=(20, 140))
    weightset = wx.SpinCtrl(panel, value='0', pos=(100, 70))
    heightset = wx.SpinCtrl(panel, value='0', pos=(100, 140))
    result = wx.StaticText(panel, label="BMI:", pos=(300, 110))
    result2 = wx.StaticText(panel, label=" ", pos=(335, 110))
    computeButton = wx.Button(panel, label='Compute', pos=(40, 200))
    closeButton = wx.Button(panel, label='Close', pos=(250, 200))
    computeButton.Bind(wx.EVT_BUTTON, self.ComBMI)
    closeButton.Bind(wx.EVT_BUTTON, self.OnClose)

def ComBMI(self, e):
    teglo = self.weight.GetValue()
    vis = self.height.GetValue()
    bmi = teglo * (pow(vis, 2))
    self.result2.SetLabel(str(bmi))

def OnClose(self, e):
    self.Close(True)


def main():

 app = wx.App()
 ex = BMI(None)
 ex.Show()
 app.MainLoop()


 if __name__ == '__main__':
      main()

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Э-э, вопрос в том, почему все это даже работает ...

Проблемы (возможно, неполные):

  1. Нет правильной инициализации класса BMI (см. учебное пособие как правильно использовать wx.Frame класс *
  2. Использование SpinCtrl либо не позволит ввести рост в метрах, либо ограничит людей до 100 см в высоту (и до 100 кг в весе, Кстати). Вместо этого используйте TextCtrl и проанализируйте значение с помощью float (или измените диапазон / разрешение SpinCtrl)
  3. Вы делаете self.weigth.GetValue() для атрибута объекта, но пользовательский ввод переходит к self.weightset
  4. Неверная формула ИМТ (посмотрите в вики), связанная с неправильными единицами
0 голосов
/ 27 марта 2020

Вам нужно разрешить __init__ вашего класса.
Используйте значения spinctrl, а не текстовые объекты.
Определите вес, который должен быть плавающим, или объясните значение для ввода в сантиметрах.
Формула - вес (кг) / (рост (M) * рост), если вы не хотите использовать множество ненужных кр sh диет;)
Возможно, вы захотите добавить возможность выбирать между Метри c и имперские значения

import wx
import wx.lib.agw.floatspin as FS

class BMI(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title='BMI Calculatot')
        panel = wx.Panel(self)
        label = wx.StaticText(panel, label="Body Mass Index", pos=(20, 10))
        weightT = wx.StaticText(panel, label="weight (Kgs):", pos=(20, 70))
        heightT = wx.StaticText(panel, label="height (M):", pos=(20, 140))
        self.weight = wx.SpinCtrl(panel, value='0', min=0, max=500, pos=(100, 70))
        #self.height = wx.SpinCtrl(panel, value='0', min=100, max=250, pos=(100, 140))

        self.height = FS.FloatSpin(panel, -1, min_val=1.00, max_val=2.50, increment=0.01, pos=(100, 140))
        self.height.SetFormat("%f")
        self.height.SetDigits(2)

        resultT = wx.StaticText(panel, label="BMI:", pos=(300, 110))
        self.result = wx.StaticText(panel, label=" ", pos=(335, 110))
        computeButton = wx.Button(panel, label='Compute', pos=(40, 200))
        closeButton = wx.Button(panel, label='Close', pos=(250, 200))
        computeButton.Bind(wx.EVT_BUTTON, self.ComBMI)
        closeButton.Bind(wx.EVT_BUTTON, self.OnClose)

    def ComBMI(self, e):
        teglo = self.weight.GetValue()
        vis = self.height.GetValue()
        bmi = teglo / (pow(vis, 2))
        self.result.SetLabel(str(round(bmi,3)))

    def OnClose(self, e):
        self.Close(True)

if __name__ == '__main__':
    app = wx.App()
    ex = BMI()
    ex.Show()
    app.MainLoop()

enter image description here

...