Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 18, 2019 19:53:47

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

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

from tkinter import *
from tkinter import messagebox

def mat04():
root04 = Tk()
root04.geometry('500x500+500+100')
root04.title('')
label1 = Label(root04, width=25, font=("Ubunte", 10), text='')
label1.grid(row=0, column=0)
label2 = Label(root04, width=25, font=("Ubunte", 10), text='')
label2.grid(row=0, column=1)
label3 = Label(root04, width=25, font=("Ubunte", 10), text='')
label3.grid(row=1, column=0)
text1=Entry(root04, width=10)
text1.grid(row=1, column=1)
q = "0123456789."
if text1.get()[0] not in q:
text1.insert(END, "Ошибка")
messagebox.showerror("ошибка")

def start_04():
mat04()

root = Tk()
root.geometry('500x500+400+100')
root.title('')
label = Label(root, width=25, font=("Ubunte", 10), text='')
label.grid(row=0, columnspan=2)
btn1 = Button(root, text="0.4 кВ", font=("Ubunte", 10), command=start_04)
btn1.grid(row=1, column=0, sticky="ew")
root.mainloop()

Начну с того, что я только учусь и хочу сделать простейшую программку для расчетов.
Возникли проблемы:
1. необходимо сделать запрет на ввод других символов кроме переменной q
2. необходимо выдернуть число из text1 (float) использовать в дальнейших расчетах.

уже всю голову поломал), как это сделать. за пример взял калькулятор вот у этого автора (https://www.youtube.com/watch?v=9JlEi_1iHKs).
Почему то не работает, подскажите!!!

Офлайн

#2 Апрель 18, 2019 20:51:24

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

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

может быть я что-то не ясно объяснил?

Офлайн

#3 Апрель 19, 2019 03:32:34

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

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

Вообще, к Entry принято присоединять переменную типа StringVar и потом работать с этой переменной. То есть работа с Entry напрямую считается устаревшим методом.

white
как это сделать. за пример взял калькулятор вот у этого автора
А ты комментарии не читал там?
что код либо заучен, либо читается по бумажке. Взять хотя бы метод get(), который Анастасия читает как “джет”.
Почему вы пишете в начале:
from tkinter import *
from tkinter import messagebox ?
Разве “*” не означает импортировать ВСЕ, в том числе и messagebox?
ITGENIO, сбрось пожалуйста свой код
Она не шарит, как код писать и просто обмениваться им, но взялась учить кого-то.

Вот тебе простой пример работы с Entry
  
#!/usr/bin/env python3
 
import tkinter as tk
from tkinter.constants import *
 
class App(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        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()
        self.frame_top.entry_var.set('???')
        self.frame_top.entry = tk.Entry(self.frame_top, textvariable=self.frame_top.entry_var)
        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()
        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()
    root.master.title('Window')
    root.master.geometry('300x70+500+500')
    root.mainloop()
 
if __name__ == '__main__':
    main()



Отредактировано py.user.next (Апрель 19, 2019 03:34:47)

Офлайн

#4 Апрель 19, 2019 07:35:04

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

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

Почему вы пишете в начале:
from tkinter import *
from tkinter import messagebox ?
Разве “*” не означает импортировать ВСЕ, в том числе и messagebox?

не знал.

Вот тебе простой пример работы с Entry
спасибо, но как сделать что бы можно было вводить только цифры?
Если за переменную типа StringVar изменю на DoubleVar это должно помочь?
    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)

как в дальнейшем использовать переменную entry_string?
к примеру почему не работает :
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)

s = entry_string*entry_string
print(s)


Она не шарит, как код писать и просто обмениваться им, но взялась учить кого-то.
Да я и сам не шарю), мой опыт программирования примерно неделя).

Так что прошу прощения я глупости которые я иногда буду задавать

Отредактировано white (Апрель 19, 2019 08:31:24)

Офлайн

#5 Апрель 19, 2019 11:14:53

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

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

white
спасибо, но как сделать что бы можно было вводить только цифры?
Вводишь строку, потом после ввода эту строку передаёшь на проверку содержимого. Если проверка пройдена, то дальше уже строку приводишь к float, иначе выдаёшь сообщение об ошибке, очищаешь переменную, привязанную к Entry, и ждёшь нового ввода.
Для проверки строки можно использовать модуль re.

white
как в дальнейшем использовать переменную entry_string?
Надо привести строку к вещественному типу. Не надо привязывать числовые переменные к Entry, так как проверка может требовать многих разных действий. Числовые переменные используются в числовых вводах типа Spinbox, где точно строки быть не может.

  
if check_input(string):
    number = float(string)
else:
    print_error_message('Incorrect value, need float: ' + string)



Отредактировано py.user.next (Апрель 19, 2019 11:20:45)

Офлайн

#6 Апрель 23, 2019 18:13:27

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

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

 Вводишь строку, потом после ввода эту строку передаёшь на проверку содержимого. Если проверка пройдена, то дальше уже строку приводишь к float, иначе выдаёшь сообщение об ошибке, очищаешь переменную, привязанную к Entry, и ждёшь нового ввода.
Для проверки строки можно использовать модуль re

Спасибо, а можешь пример написать? какой нибудь простенький

Офлайн

#7 Апрель 23, 2019 19:51:26

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

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

 from tkinter import *
def printtext():
    global e
    string = e.get()
    print(string)
root = Tk()
root.title('Name')
e = Entry(root)
e.pack()
b = Button(root,text='okay',command=printtext)
b.pack(side='bottom')
root.mainloop()

часть задачи решить получилось.
Осталось:
В поле entry должно разрешаться вводить только числа float, для дальнейшего использования в расчетах.
Есть мысли как это сделать?

Офлайн

#8 Апрель 23, 2019 20:42:20

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

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

Можно же рабоче-крестьянским методом сделать проверку: завернуть преобразование в try и всего-то делов. Например, как-то так:

 try:
    number = float(string)
except ValueError:
    # Сюда воткнуть вывод сообщения типа "Что за ерунду ты ввёл?"
    # далее сделать передачу фокуса ввода на entry, предварительно туда загнав значение "0" 
    # или удалить неправильное значение или оставить как есть, чтобы пользователь исправил.

Отредактировано Rafik (Апрель 23, 2019 20:43:17)

Офлайн

#9 Апрель 23, 2019 20:45:17

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

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

Rafik
Можно же рабоче-крестьянским методом сделать проверку: завернуть преобразование в try и всего-то делов. Например, как-то так:

я занимаюсь программирование от силы неделю)), по этому рабоче-крестьянские методы мне не знакомы)
ну кроме float(input))

Офлайн

#10 Апрель 23, 2019 21:28:23

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

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

Можно же рабоче-крестьянским методом сделать проверку: завернуть преобразование в try и всего-то делов. Например, как-то так:

 try:
    number = float(string)
except ValueError:
    # Сюда воткнуть вывод сообщения типа "Что за ерунду ты ввёл?"
    # далее сделать передачу фокуса ввода на entry, предварительно туда загнав значение "0" 
    # или удалить неправильное значение
—-
Дополню свой ответ.
Если очень хочется отслеживать вводимые символы именно в Entry, то можно перехватывать событие KeyPress для виждета, проанализировать, что было нажато и реагировать удалением непотребного символа с текущей позиции entry. Привязка функции к KeyPress выглядит приблизительно так:
 def onKeyPress(event):
    symvol = getattr(event, 'char')  # Получим символ нажатой клавиши
    if symvol != '.' and (symvol < '0'  or symvol > '9') :  # Если запрещённый символ
        # Сюда пишем команду убрать текущий символ из entry
        # как применить  метод delete виджета entry придумай. Материал на эту тему имеется в гугле. 
        
tvoj_entry.bind('<KeyPress>',  onKeyPress)  # Привяжем событие KeyPress твоего enrty к функции onKeyPress 

Отредактировано Rafik (Апрель 23, 2019 21:34:16)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version