Форум сайта python.su
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()
Офлайн
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()
Офлайн
whiteПример работы с Entry выше написан. У тебя нет переменной, подключенной к Entry. Читай пример, запусти его и посмотри, как там Entry сделано. Никакой прямой работы с Entry не должно быть. С подключенной переменной же ты можешь работать как угодно. Так как она отделена от интерфейса, она не будет его подвешивать или брать не те значения в случае продолжающегося ввода. А при прямой обработке Enrty может быть коллизия - когда пользователь вводит что-то, а в это время введённое значение обрабатывается алгоритмом. В общем, чтобы меньше зависонов было в интерфейсе, нужно отделять его от внутренней логики программы.
В поле entry должно разрешаться вводить только числа float, для дальнейшего использования в расчетах.
Есть мысли как это сделать?
Офлайн
py.user.next
Пример работы с Entry выше написан. У тебя нет переменной, подключенной к Entry. Читай пример, запусти его и посмотри, как там Entry сделано. Никакой прямой работы с Entry не должно быть. С подключенной переменной же ты можешь работать как угодно. Так как она отделена от интерфейса, она не будет его подвешивать или брать не те значения в случае продолжающегося ввода. А при прямой обработке Enrty может быть коллизия - когда пользователь вводит что-то, а в это время введённое значение обрабатывается алгоритмом. В общем, чтобы меньше зависонов было в интерфейсе, нужно отделять его от внутренней логики программы.
Офлайн
Пример работы с Entry выше написан. У тебя нет переменной, подключенной к Entry. Читай пример, запусти его и посмотри, как там Entry сделано. Никакой прямой работы с Entry не должно быть. С подключенной переменной же ты можешь работать как угодно. Так как она отделена от интерфейса, она не будет его подвешивать или брать не те значения в случае продолжающегося ввода. А при прямой обработке Enrty может быть коллизия - когда пользователь вводит что-то, а в это время введённое значение обрабатывается алгоритмом. В общем, чтобы меньше зависонов было в интерфейсе, нужно отделять его от внутренней логики программы.
Отредактировано white (Апрель 24, 2019 11:27:07)
Офлайн
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()
Офлайн
RafikНе для другого Entry, а для Label (надпись). Бывает, что надо менять текст надписи, поэтому точно так же делается переменная, которая и будет использована для изменения текста в ней. Дальше переменная прицепляется к Label и Label больше не трогается, вся работа идёт через переменную. Переменную можно передавать в функции, которые уже будут устанавливать в ней значения.
Здесь объявляем переменную для другого entry
Отредактировано py.user.next (Апрель 24, 2019 14:57:31)
Офлайн
Rafik
Там ничего сложного. Начни просмотр моих комментариев с последних строк и двигайся вверх до создания экземпляра класса. Далее продолжи просмотр с момента объявления класса class App…
Офлайн
whiteПрежде чем писать программу, к этому надо готовиться - получать все знания, которые нужны для её разработки. Как нельзя пятиэтажку построить, имея только молоток и гвозди, так нельзя и графическую программу написать, зная только о переменных и значениях.
но даже с твоими комментами мне пока еще это сложновато понять
Офлайн
Прежде чем писать программу, к этому надо готовиться - получать все знания, которые нужны для её разработки. Как нельзя пятиэтажку построить, имея только молоток и гвозди, так нельзя и графическую программу написать, зная только о переменных и значениях.
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()
Отредактировано white (Апрель 25, 2019 06:43:50)
Офлайн