Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 23, 2019 21:37:05

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

entry, как достать от туда число


Rafik
—-
Дополню свой ответ.
Если очень хочется отслеживать вводимые символы именно в Entry, то можно перехватывать событие KeyPress для виждета, проанализировать, что было нажато и реагировать удалением непотребного символа с текущей позиции entry. Привязка функции к KeyPress выглядит приблизительно так:
def onKeyPress(event):
symvol = getattr(event, ‘char’) # Получим символ нажатой клавиши
if symvol != ‘.’ and (symvol < ‘0’ or symvol > ‘9’) : # Если запрещённый символ
# Пишем команду убрать текущий символ из entry.

tvoj_entry.bind('<KeyPress>', onKeyPress) # Привяжем событие KeyPress твоего enrty к функции onKeyPress
Отредактировано Rafik (сегодня 21:31:11)

Это как то сложно еще для моего понимания.

from tkinter import *
from tkinter import messagebox
def printtext():
global e
string = e.get()
if e.get() == False:
showerror("Ошибка", "Должно быть введено число")
else:
s = int(string)
d = s+2
print(d)
root = Tk()
root.title('Name')
e = Entry(root)
e.pack()
b = Button(root,text='okay',command=printtext)
b.pack(side='bottom')
root.mainloop()

В чем ошибка?

Офлайн

#2 Апрель 23, 2019 22:02:25

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

entry, как достать от туда число

Rafik я тебя готов расцеловать.
где ты был раньше


 from tkinter import *
from tkinter import messagebox
def printtext():
    global e
    string = e.get()
    try:
        s = float(string)
        d = s+2
        print(d)
    except ValueError:
        messagebox.showerror("Ошибка", "Должно быть введено число")
root = Tk()
root.title('Name')
e = Entry(root)
e.pack()
b = Button(root,text='okay',command=printtext)
b.pack(side='bottom')
root.mainloop()

Офлайн

#3 Апрель 23, 2019 23:57:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

entry, как достать от туда число

white
В поле entry должно разрешаться вводить только числа float, для дальнейшего использования в расчетах.
Есть мысли как это сделать?
Пример работы с Entry выше написан. У тебя нет переменной, подключенной к Entry. Читай пример, запусти его и посмотри, как там Entry сделано. Никакой прямой работы с Entry не должно быть. С подключенной переменной же ты можешь работать как угодно. Так как она отделена от интерфейса, она не будет его подвешивать или брать не те значения в случае продолжающегося ввода. А при прямой обработке Enrty может быть коллизия - когда пользователь вводит что-то, а в это время введённое значение обрабатывается алгоритмом. В общем, чтобы меньше зависонов было в интерфейсе, нужно отделять его от внутренней логики программы.



Офлайн

#4 Апрель 24, 2019 06:09:15

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

entry, как достать от туда число

py.user.next
Пример работы с Entry выше написан. У тебя нет переменной, подключенной к Entry. Читай пример, запусти его и посмотри, как там Entry сделано. Никакой прямой работы с Entry не должно быть. С подключенной переменной же ты можешь работать как угодно. Так как она отделена от интерфейса, она не будет его подвешивать или брать не те значения в случае продолжающегося ввода. А при прямой обработке Enrty может быть коллизия - когда пользователь вводит что-то, а в это время введённое значение обрабатывается алгоритмом. В общем, чтобы меньше зависонов было в интерфейсе, нужно отделять его от внутренней логики программы.

спасибо, постараюсь учесть

Офлайн

#5 Апрель 24, 2019 11:26:40

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

entry, как достать от туда число

Пример работы с Entry выше написан. У тебя нет переменной, подключенной к Entry. Читай пример, запусти его и посмотри, как там Entry сделано. Никакой прямой работы с Entry не должно быть. С подключенной переменной же ты можешь работать как угодно. Так как она отделена от интерфейса, она не будет его подвешивать или брать не те значения в случае продолжающегося ввода. А при прямой обработке Enrty может быть коллизия - когда пользователь вводит что-то, а в это время введённое значение обрабатывается алгоритмом. В общем, чтобы меньше зависонов было в интерфейсе, нужно отделять его от внутренней логики программы.

я вообще не понимаю как там работает

Отредактировано white (Апрель 24, 2019 11:27:07)

Офлайн

#6 Апрель 24, 2019 12:47:26

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

entry, как достать от туда число

white
я вообще не понимаю как там работает
Там ничего сложного. Начни просмотр моих комментариев с последних строк и двигайся вверх до создания экземпляра класса. Далее продолжи просмотр с момента объявления класса class App…
   
#!/usr/bin/env python3
 
import tkinter as tk
from tkinter.constants import *
 
class App(tk.Frame):  # Наследуем всё и вся от tk.Frame
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)   # Инициализируем tk.Frame
        self.pack(fill=BOTH)
        self.create_widgets()  # Запускаем создание виджетов
 
    def create_widgets(self):  # Здесь создаются виджеты
        self.frame_top = tk.Frame(self)
        self.frame_top.pack(fill=BOTH)
        self.frame_bottom = tk.Frame(self)
        self.frame_bottom.pack(fill=BOTH)
         
        self.frame_top.label_enter = tk.Label(self.frame_top, text='Enter:')
        self.frame_top.label_enter.pack(side=LEFT)
 
        self.frame_top.entry_var = tk.StringVar()  # Объявляем переменную, которая будет использована в entry
        self.frame_top.entry_var.set('???')  # Здесь присваиваем ей значение '???'
        self.frame_top.entry = tk.Entry(self.frame_top, textvariable=self.frame_top.entry_var)  # Привязываем переменную к entry
        self.frame_top.entry.pack(side=LEFT)
 
        self.frame_top.button_ok = tk.Button(self.frame_top,
                                             text='Ok',
                                             command=self.press_button_ok)
        self.frame_top.button_ok.pack(side=LEFT)
        self.frame_top.button_quit = tk.Button(self.frame_top,
                                               text='Quit',
                                               command=self.master.destroy)
        self.frame_top.button_quit.pack(side=LEFT)
 
        self.frame_bottom.label_result_info = tk.Label(self.frame_bottom, text='Result:')
        self.frame_bottom.label_result_info.pack(side=LEFT)
 
        self.frame_bottom.label_result_var = tk.StringVar()   # Здесь объявляем переменную для другого entry и далее как и с первым
        self.frame_bottom.label_result_var.set('***')
        self.frame_bottom.label_result = tk.Label(self.frame_bottom,
                                                  textvariable=self.frame_bottom.label_result_var)
        self.frame_bottom.label_result.pack(side=LEFT)
         
    def press_button_ok(self):
        entry_string = self.frame_top.entry_var.get()
 
        print(repr(entry_string))
        self.frame_bottom.label_result_var.set(entry_string)
 
def main():
    root = App()   # Здесь создаём экземпляр класса, грубо говоря, запускаем в работу App.__init__
                         # и создаём объект описанный классом App
    root.master.title('Window')
    root.master.geometry('300x70+500+500')
    root.mainloop()
 
if __name__ == '__main__':  # Если этот файл запущен как скрипт, а не импортирован.
    main()  # Выполняем main()

Офлайн

#7 Апрель 24, 2019 14:55:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

entry, как достать от туда число

Rafik
Здесь объявляем переменную для другого entry
Не для другого Entry, а для Label (надпись). Бывает, что надо менять текст надписи, поэтому точно так же делается переменная, которая и будет использована для изменения текста в ней. Дальше переменная прицепляется к Label и Label больше не трогается, вся работа идёт через переменную. Переменную можно передавать в функции, которые уже будут устанавливать в ней значения.



Отредактировано py.user.next (Апрель 24, 2019 14:57:31)

Офлайн

#8 Апрель 24, 2019 21:12:52

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

entry, как достать от туда число

Rafik
Там ничего сложного. Начни просмотр моих комментариев с последних строк и двигайся вверх до создания экземпляра класса. Далее продолжи просмотр с момента объявления класса class App…

Спасибо, но даже с твоими комментами мне пока еще это сложновато понять

Офлайн

#9 Апрель 25, 2019 01:40:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

entry, как достать от туда число

white
но даже с твоими комментами мне пока еще это сложновато понять
Прежде чем писать программу, к этому надо готовиться - получать все знания, которые нужны для её разработки. Как нельзя пятиэтажку построить, имея только молоток и гвозди, так нельзя и графическую программу написать, зная только о переменных и значениях.



Офлайн

#10 Апрель 25, 2019 06:41:47

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

entry, как достать от туда число

Прежде чем писать программу, к этому надо готовиться - получать все знания, которые нужны для её разработки. Как нельзя пятиэтажку построить, имея только молоток и гвозди, так нельзя и графическую программу написать, зная только о переменных и значениях.

формально что то у меня получилось, но много багов. Я просто не знаю правила написания.
я вот пишу:
     button1 = Button(root1, text="Сложение", font=("Ubunte", 10), command=transfer)
    button1.grid(row=6, columnspan=2, sticky="ew")
Вроде просто создаю кнопку, и привязываю команду.

вы пишите
         self.frame_bottom = tk.Frame(self)
        self.frame_bottom.pack(fill=BOTH)

я так понимаю это одно и тоже ? + -

 from tkinter import *
from tkinter import messagebox
Inom = Ikz3max = Ikz2 = "нет данных"
def root01():
    global Snom
    global Unom
    global cosf
    global Xd
    global Eg
    root1 = Tk()
    root1.geometry('200x200+100+100') #размер окна и координаты
    root1.title('Расчет ТКЗ') #название окна
    label0 = Label(root1, width=5, font=("Ubunte", 10), text='Г-1')
    label0.grid(row=0, columnspan=2)
    label1 = Label(root1, width=5, font=("Ubunte", 10), text='S, кВА')
    label1.grid(row=1, column=0)
    label2 = Label(root1, width=5, font=("Ubunte", 10), text='U, кВ')
    label2.grid(row=2, column=0)
    label3 = Label(root1, width=5, font=("Ubunte", 10), text='cosf')
    label3.grid(row=3, column=0)
    label4 = Label(root1, width=5, font=("Ubunte", 10), text='X"d')
    label4.grid(row=4, column=0)
    label5 = Label(root1, width=5, font=("Ubunte", 10), text='E"d')
    label5.grid(row=5, column=0)
    Snom = Entry(root1, width=10)
    Snom.grid(row=1, column=1)
    Unom = Entry(root1, width=10)
    Unom.grid(row=2, column=1)
    cosf = Entry(root1, width=10)
    cosf.grid(row=3, column=1)
    Xd = Entry(root1, width=10)
    Xd.grid(row=4, column=1)
    Eg = Entry(root1, width=10)
    Eg.grid(row=5, column=1)
    button1 = Button(root1, text="Сложение", font=("Ubunte", 10), command=transfer)
    button1.grid(row=6, columnspan=2, sticky="ew")
def transfer():
    global Snom
    global Unom
    global cosf
    global Xd
    global Eg
    Snom = Snom.get()
    try:
        Snom = float(Snom)
    except ValueError:
        messagebox.showerror("Ошибка", "Должно быть введено число")
    Unom = Unom.get()
    try:
        Unom=float(Unom)
    except ValueError:
        messagebox.showerror("Ошибка", "Должно быть введено число")
    cosf = cosf.get()
    try:
        cosf=float(cosf)
    except ValueError:
        messagebox.showerror("Ошибка", "Должно быть введено число")
    Xd = Xd.get()
    try:
        Xd=float(Xd)
    except ValueError:
        messagebox.showerror("Ошибка", "Должно быть введено число")
    Eg = Eg.get()
    try:
        Eg=float(Eg)
    except ValueError:
        messagebox.showerror("Ошибка", "Должно быть введено число")
    decision()
def decision():
    global Inom
    global Ikz3max
    global Ikz2
    Inom = round(Snom/(1.73*Unom), 2)
    Ikz3max = round((Eg*Inom)/Xd, 2)
    Ikz2 = round((Eg*1.73*Inom)/(Xd+Xd), 2)
    write()
    root.quit()
def write():
    my_file = open("Результат.txt", "w")
    my_file.write("Номинальная мощность генератора:    " + str(Snom) + "кВА" + '\n')
    my_file.write("Номинальный ток генератора:    " + str(Inom) + "А" + '\n')
    my_file.write("Ток трехфазного КЗ в t=0:    " + str(Ikz3max) + "A" + '\n')
    my_file.write("Ток двухфазного КЗ в t=0:    " + str(Ikz2) + "A" + '\n')
    my_file.close()
root = Tk()
root.geometry('150x150+0+0') #размер окна и координаты
root.title('Расчет') #название окна
label = Label(root, width=25, font=("Ubunte", 10), text='Расчет ТКЗ')
label.grid(row=0, columnspan=2)
btn1 = Button(root, text="Расчет", font=("Ubunte", 10), command=root01)
btn1.grid(row=1, column=0, sticky="ew")
root.mainloop()

Я наверное нарушил все правили написания)
Подскажите как сделать, что бы после расчета закрылось root01?

Есть способ сократить длину “кода”?
И еще, как на фон добавить картинку? гуглил, но не получилось ничего

Отредактировано white (Апрель 25, 2019 06:43:50)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version