Как исправить вывод из поля ввода - PullRequest
1 голос
/ 13 июня 2019

При использовании кнопки подачи, сценарий для F полностью проходит до печати до появления окна «master», а затем не реагирует на входные данные из окна «master».Это приводит к выходной мощности 0,0 кВт, потому что ввод представляет собой длинные десятичные дроби, за которыми следует буква L, когда пользователь вводит 8777

Я бродил по Интернету уже около суток, но не нашел удачичто-нибудь.Я очень плохо знаком с TK, но пытался выучить его.

def F():
    master = tk.Tk()
    tk.Label(master, text = 'Feeder Number: ').grid(row=0)
    entry1 = tk.Entry(master)
    entry1.grid(row=0, column=1)
    button2 = tk.Button(master,
                        text=' Confirm',
                        command=entry1.get())
    button2.pack()
    button2.grid(row=0, column=2)
    fn = entry1.pack()
    print fn
    feed = filtered['Feeder']==fn
    feedfn = filtered[feed]
    Cap = feedfn['AC Name Plate Capacity <= 10kw']
    Cap = Cap.astype(float)
    AcPv = Cap.sum()
    print 'The total PV on this feeder is:', AcPv, 'kW'

root = tk.Tk()
frame = tk.Frame(root)
frame.pack()

button = tk.Button(frame,
                   text='Exit',
                   fg='red',
                   command=quit)
button.pack()
button.grid(row=1, column=1)

Fee = tk.Button(frame,
                text='Feeder',
                command=F)
Fee.pack()
Fee.grid(row=0, column=1)

root.mainloop()

Ожидаемый 27.702 Выход 0.0 Учитывая, что я не буду публиковать csv, entry1 / fn должен быть 8777

в настоящее время'none'

ОБНОВЛЕНИЕ Теперь я получаю вывод PY_VAR при печати fn, я понимаю, что код выполняется полностью до ввода.Любые рекомендации о том, как принять входные данные до запуска фильтров?

def F():
    master = tk.Tk()
    tk.Label(master, text = 'Feeder Number: ').grid(row=0)
    entry1 = tk.Entry(master)
    entry1.grid(row=0, column=1)
    button2 = tk.Button(master,
                        text=' Confirm',
                        command=entry1.get())
    button2.grid(row=0, column=2)
    fn = tk.IntVar()
    print fn
    feed = filtered['Feeder']==fn
    feedfn = filtered[feed]
    Cap = feedfn['AC Name Plate Capacity <= 10kw']
    Cap = Cap.astype(float)
    AcPv = Cap.sum()
    print 'The total PV on this feeder is:', AcPv, 'kW'

Для тех, кто интересуется окончательным кодом (который работал для меня):

def F():
    master = tk.Tk()
    tk.Label(master, text = 'Feeder Number: ').grid(row=0)

    entry = tk.Entry(master)
    entry.grid(row=0, column=1)

    def pint():
        data = entry.get()
        master.destroy()
        feed = filtered['Feeder']==data
        feedfn = filtered[feed]
        Cap = feedfn['AC Name Plate Capacity <= 10kw']
        Cap = Cap.astype(float)
        AcPv = Cap.sum()

        fdf = tk.Tk()
        tk.Label(fdf, text = AcPv).grid(row=0)

        button4 = tk.Button(fdf,
                            text = ' Exit',
                            fg='red',
                            command=fdf.destroy)
        button4.grid(row=1)

    button2 = tk.Button(master,
                        text=' Confirm',
                        command = pint)
    button2.grid(row=0, column=2)

    button3 = tk.Button(master,
                        text = ' Exit',
                        fg='red',
                        command=master.destroy)
    button3.grid(row=0, column=3)

    master.mainloop()

1 Ответ

0 голосов
/ 13 июня 2019

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

Во-первых, почему ваш код выполняется без показа главного окна:

Ваш tkinter нуждается в mainloop() вызовите, если вы хотите постоянное окно.

master.mainloop()

Вы сделали это правильно со своим рутом, но у вашего мастера этого основного цикла нет.Эта строка - то, что в основном поддерживает ваш графический интерфейс и циклически изменяет его, пока он так или иначе не будет уничтожен.Вам нужно добавить эту строку после создания виджетов, чтобы иметь возможность взаимодействовать с окном.Все, что написано после этой строки (но все еще с отступом в определении), будет выполнено, когда ваше окно закрыто, либо вручную, либо с помощью команды:

master.destroy()

Далее, хотя это приведет к созданию рабочего окна, вы можетепо-прежнему взаимодействовать с корневым окном, пока главное окно открыто, что может привести к проблемам, если вы ожидаете переменную от главного.Я предлагаю вам прочитать о виджете Toplevel, который создан специально для таких случаев, как ваш.(http://effbot.org/tkinterbook/toplevel.htm) В качестве альтернативы вы также можете использовать tkinter tkSimpleDialog.askinteger или askfloat функции, которые кажутся идеальными для вашего приложения.

Наконец, запись позволяет вам писать текст, но как получить доступ к тексту? Выможно использовать Entry1.get () для извлечения содержимого записи, или, как вы начали в своем обновлении, вы можете назначить для записи переменную tkinter. Эта переменная будет обновляться при изменении строк записи или чисел взапись. Чтобы связать переменную с вашей записью, вы должны указать ее при создании записи:

fn = tk.StringVar(value = '000')
entry1 = tk.Entry(master, textvariable = fn)

* Обратите внимание, что для этого потребуется, чтобы ваша переменная fn была инициализирована перед записью. Также вы можете инициализироватьзначение для этой переменной при создании

переменная tkinter является объектом, поэтому при его печати вы получаете PY_VAR. (тип объекта). Для доступа к значению вам необходимо использовать метод get ():

print(fn.get())
...