Найти - Пользователи
Полная версия: entry, как достать от туда число
Начало » Python для новичков » entry, как достать от туда число
1 2 3
white
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).
Почему то не работает, подскажите!!!
white
может быть я что-то не ясно объяснил?
py.user.next
Вообще, к 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()
white
Почему вы пишете в начале:
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)


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

Так что прошу прощения я глупости которые я иногда буду задавать
py.user.next
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)
white
 Вводишь строку, потом после ввода эту строку передаёшь на проверку содержимого. Если проверка пройдена, то дальше уже строку приводишь к float, иначе выдаёшь сообщение об ошибке, очищаешь переменную, привязанную к Entry, и ждёшь нового ввода.
Для проверки строки можно использовать модуль re

Спасибо, а можешь пример написать? какой нибудь простенький
white
 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, для дальнейшего использования в расчетах.
Есть мысли как это сделать?
Rafik
Можно же рабоче-крестьянским методом сделать проверку: завернуть преобразование в try и всего-то делов. Например, как-то так:
 try:
    number = float(string)
except ValueError:
    # Сюда воткнуть вывод сообщения типа "Что за ерунду ты ввёл?"
    # далее сделать передачу фокуса ввода на entry, предварительно туда загнав значение "0" 
    # или удалить неправильное значение или оставить как есть, чтобы пользователь исправил.
white
Rafik
Можно же рабоче-крестьянским методом сделать проверку: завернуть преобразование в try и всего-то делов. Например, как-то так:

я занимаюсь программирование от силы неделю)), по этому рабоче-крестьянские методы мне не знакомы)
ну кроме float(input))
Rafik
Можно же рабоче-крестьянским методом сделать проверку: завернуть преобразование в 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 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB