Форум сайта python.su
Здравствуйте.
Написал простейшую программу, “calcpy123”.
Создал в qtdesinger три оболочки, под эту программу, “calcpy1”, “calcpy2”, “calcpy3”.
Не знаю как их соединить в единый исполняемый файл:
main1 = calcpy123 + calcpy1
main2 = calcpy123 + calcpy2
main3 = calcpy123 + calcpy3
* в calcpy1 результаты должны автоматически обновляться при изменении входных данных
* в calcpy2 результаты обновляются только после нажатия своей кнопки, остальные результаты остаются неизменными не зависимо от перемены входных данных.
* в calcpy3 меняются сразу все результаты по нажатию кнопки.
Надписи на кнопке получилось сделать в несколько рядов только отдельными блоками, при наведении и попадание курсора на надписи курсора (в границах блока слова), кнопка не срабатывает.
Прикреплённый файлы:
calcpy.zip (11,9 KБ)
Офлайн
Здесь помогли человеку разобраться с похожим вопросом. Только у него знаний и понимания больше было чем у меня сейчас.
В QtDesinger есть “edit signal/slot”. Попробую хотя бы с этим самостоятельно разобраться (надеюсь получится), пока никто не откликнулся.
Офлайн
urandart
* в calcpy1 результаты должны автоматически обновляться при изменении входных данных
* в calcpy2 результаты обновляются только после нажатия своей кнопки, остальные результаты остаются неизменными не зависимо от перемены входных данных.
* в calcpy3 меняются сразу все результаты по нажатию кнопки.
Офлайн
xam1816Мне не принципиально на чем основана графика.
Офлайн
urandart
Изначально gui начинал делать в tkinter и тоже застопорился на шаге соединения окна и кода,
import tkinter as tk # интерфейс class MyApp(tk.Tk): def __init__(self): super().__init__() # имеет свои атрибуты self.title('my app') self.lbl = tk.Label(text='введите данные') self.entry1 = tk.Entry() self.btn = tk.Button(text='отправить данные') self.lbl2 = tk.Label(text='полученные данные после обработки =>') self.text_field = tk.Text(width=30, height=5) self.lbl.grid() self.entry1.grid(row=1) self.btn.grid(row=2) self.lbl2.grid(row=1, column=1, rowspan=2) self.text_field.grid(row=1, column=2, rowspan=2) # имеет методы(или команды) доступные для других def show_new_data(self, data): # показать в текстовом поле данные self.text_field.delete(1.0, 'end') self.text_field.insert(1.0, data) def get_data(self): # вернуть данные из строки ввода return self.entry1.get() def change_bg(self, num): # изменить фон текстового поля colors = { 8: 'red', 5: 'green' } self.text_field.config(bg=colors.get(num, 'gold')) # процессор class Processor: # имеет методы def upper(self, text:str): # вернуть текст в верхнем регистре return text.upper() def sum(self, iter): # вернуть сумму чисел return sum(iter) # объединяющее пространство class Program: def __init__(self): self.app = MyApp() # подключаем нужный интерфейс self.pr = Processor() # подключаем нужный процессор self.app.btn.config(command=self.action) # подключаем к кнопке интерфейса функцию def action(self): # вот функция, которая содержит алгоритм обработки информации text = self.app.get_data() # у интерфейса есть комманда, спомощью которой можно получить текст из ввода # далее работаю с полученным текстом if text.isdigit(): # если текст число s = self.pr.sum(int(i) for i in text) # могу получить суммy цифр числа,воспользовавшись методаом процессора self.app.change_bg(s) # отправить полученные данные в метод изменения фона self.app.show_new_data(s) # вывести на экран else: new_text = self.pr.upper(text) # или поднять в верхний регистр self.app.show_new_data(new_text)# и вывести def run(self): self.app.mainloop() if __name__ == '__main__': Program().run()
Офлайн
xam1816Есть какая то разница в порядке расположения указанных вами частей кода. К примеру, можно поменять 1 и 2 пункт местами, или 1 и 3?
Офлайн
urandart
Ведь по сути все равно, что первым выполнится рисование или вычисление, главное что связка будет последней.
Офлайн
gui на tkinter
from tkinter import * import tkinter as tk import tkinter.font as tkFont # интерфейс class Okno: def __init__(self, root): # название окна root.title("PROBA") # парамерры окна ## width=600 ## height=180 ## screenwidth = root.winfo_screenwidth() ## screenheight = root.winfo_screenheight() ## alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2) ## root.geometry(alignstr) ## root.resizable(width=False, height=False) Okn_1=tk.Label(root) Okn_1["bd"] = "3px" Okn_1["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) Okn_1["font"] = ft Okn_1["bg"] = "white" Okn_1["fg"] = "red" Okn_1["justify"] = "center" Okn_1["text"] = "Первое число" ## Okn_1.place(x=10,y=10,width=470,height=30) Okn_1.grid(sticky=NSEW, padx=5, pady=2) Okn_2=tk.Entry(root) Okn_2["borderwidth"] = "3px" ft = tkFont.Font(family='Times',size=18) Okn_2["font"] = ft Okn_2["fg"] = "#333333" Okn_2["justify"] = "center" Okn_2["text"] = "12345678" ## Okn_2.place(x=490,y=10,width=100,height=30) Okn_2.grid(row=0, column=1,sticky=NSEW,padx=5, pady=2) Okn_3=tk.Label(root) Okn_3["borderwidth"] = "3px" Okn_3["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) Okn_3["font"] = ft Okn_3["bg"] = "white" Okn_3["fg"] = "red" Okn_3["justify"] = "center" Okn_3["text"] = "Второе число" ## Okn_3.place(x=10,y=50,width=470,height=30) Okn_3.grid(row=1, sticky=NSEW, padx=5, pady=2) Okn_4=tk.Entry(root) Okn_4["borderwidth"] = "3px" ft = tkFont.Font(family='Times',size=18) Okn_4["font"] = ft Okn_4["fg"] = "black" Okn_4["justify"] = "center" Okn_4["text"] = "12345678" ## Okn_4.place(x=490,y=50,width=100,height=30) Okn_4.grid(row=1, column=1,sticky=NSEW,padx=5, pady=2) Okn_5=tk.Label(root) Okn_5["borderwidth"] = "3px" Okn_5["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) Okn_5["font"] = ft Okn_5["bg"] = "white" Okn_5["fg"] = "green" Okn_5["justify"] = "center" Okn_5["text"] = "Сложить первое и второе число" ## Okn_5.place(x=10,y=90,width=470,height=30) Okn_5.grid(row=2,sticky=NSEW, padx=5, pady=2) Okn_6=tk.Label(root) Okn_6["borderwidth"] = "3px" Okn_6["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) Okn_6["font"] = ft Okn_6["bg"] = "white" Okn_6["fg"] = "black" Okn_6["justify"] = "center" Okn_6["text"] = "+ результат +" ## Okn_6.place(x=490,y=90,width=100,height=30) Okn_6.grid(row=2, column=1,sticky=NSEW,padx=5, pady=2) Okn_7=tk.Label(root) Okn_7["borderwidth"] = "3px" Okn_7["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) Okn_7["font"] = ft Okn_7["bg"] = "white" Okn_7["fg"] = "green" Okn_7["justify"] = "center" Okn_7["text"] = "Умножить первое и второе число" ## Okn_7.place(x=10,y=130,width=470,height=30) Okn_7.grid(row=3,sticky=NSEW, padx=5, pady=5) Okn_8=tk.Label(root) Okn_8["borderwidth"] = "3px" Okn_8["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) Okn_8["font"] = ft Okn_8["bg"] = "white" Okn_8["fg"] = "black" Okn_8["justify"] = "center" Okn_8["text"] = "* результат *" ## Okn_8.place(x=490,y=130,width=100,height=30) Okn_8.grid(row=3, column=1,sticky=NSEW,padx=5, pady=5) if __name__ == "__main__": root = tk.Tk() app = Okno(root) root.mainloop()
Отредактировано urandart (Март 10, 2023 17:09:33)
Офлайн
код программы для этого gui
#!/usr/bin/env python3 #!/user/bin/python3 #coding UTF8 def calc123(): print("="*30) p1=float(input("\n первое число ").replace(",", ".")) p2=float(input(" второе число ").replace(",", ".")) ################################################### slo=float(p1+p2) umn=float(p1*p2) ################################################### print() print(" сумма ",round(slo,2)) print(" произведение ",round(umn,2)) print() calc123() while True: flag=input(" Новый расчет? Нажми: enter") if flag=="": calc123() else: break
Офлайн
xam1816
Начал по примеру вашего кода делать свой, посмотрите, что так или не так…
И я не погу понять, какие процессы происходят в вашем коде в “объеденяющем пространстве”.
Исправте и допишите мой код: вводимые числа могут быть не целыми (float) и код выполняется без “кнопки” по факту ввода чисел.
from tkinter import * import tkinter as tk import tkinter.font as tkFont # интерфейс class Okno: def __init__(self, root): super().__init__() # название окна self.root.title("PROBA") # парамерры окна ## self.width=600 ## self.height=180 ## self.screenwidth = root.winfo_screenwidth() ## self.screenheight = root.winfo_screenheight() ## self.alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2) ## self.root.geometry(alignstr) ## self.root.resizable(width=False, height=False) self.Okn_1=tk.Label(root) self.Okn_1["bd"] = "3px" self.Okn_1["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) self.Okn_1["font"] = ft self.Okn_1["bg"] = "white" self.Okn_1["fg"] = "red" self.Okn_1["justify"] = "center" self.Okn_1["text"] = "Первое число" ## Okn_1.place(x=10,y=10,width=470,height=30) self.Okn_1.grid(sticky=NSEW, padx=5, pady=2) self.Okn_2=tk.Entry(root) self.Okn_2["borderwidth"] = "3px" ft = tkFont.Font(family='Times',size=18) self.Okn_2["font"] = ft self.Okn_2["fg"] = "#333333" self.Okn_2["justify"] = "center" self.Okn_2["text"] = "12345678" ## self.Okn_2.place(x=490,y=10,width=100,height=30) self.Okn_2.grid(row=0, column=1,sticky=NSEW,padx=5, pady=2) self.Okn_3=tk.Label(root) self.Okn_3["borderwidth"] = "3px" self.Okn_3["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) self.Okn_3["font"] = ft self.Okn_3["bg"] = "white" self.Okn_3["fg"] = "red" self.Okn_3["justify"] = "center" self.Okn_3["text"] = "Второе число" ## self.Okn_3.place(x=10,y=50,width=470,height=30) self.Okn_3.grid(row=1, sticky=NSEW, padx=5, pady=2) self.Okn_4=tk.Entry(root) self.Okn_4["borderwidth"] = "3px" ft = tkFont.Font(family='Times',size=18) self.Okn_4["font"] = ft self.Okn_4["fg"] = "black" self.Okn_4["justify"] = "center" self.Okn_4["text"] = "12345678" ## self.Okn_4.place(x=490,y=50,width=100,height=30) self.Okn_4.grid(row=1, column=1,sticky=NSEW,padx=5, pady=2) self.Okn_5=tk.Label(root) self.Okn_5["borderwidth"] = "3px" self.Okn_5["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) self.Okn_5["font"] = ft self.Okn_5["bg"] = "white" self.Okn_5["fg"] = "green" self.Okn_5["justify"] = "center" self.Okn_5["text"] = "Сложить первое и второе число" ## self.Okn_5.place(x=10,y=90,width=470,height=30) self.Okn_5.grid(row=2,sticky=NSEW, padx=5, pady=2) self.Okn_6=tk.Label(root) self.Okn_6["borderwidth"] = "3px" self.Okn_6["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) self.Okn_6["font"] = ft self.Okn_6["bg"] = "white" self.Okn_6["fg"] = "black" self.Okn_6["justify"] = "center" self.Okn_6["text"] = "+ результат +" ## self.Okn_6.place(x=490,y=90,width=100,height=30) self.Okn_6.grid(row=2, column=1,sticky=NSEW,padx=5, pady=2) self.Okn_7=tk.Label(root) self.Okn_7["borderwidth"] = "3px" self.Okn_7["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) self.Okn_7["font"] = ft self.Okn_7["bg"] = "white" self.Okn_7["fg"] = "green" self.Okn_7["justify"] = "center" self.Okn_7["text"] = "Умножить первое и второе число" ## self.Okn_7.place(x=10,y=130,width=470,height=30) self.Okn_7.grid(row=3,sticky=NSEW, padx=5, pady=5) self.Okn_8=tk.Label(root) self.Okn_8["borderwidth"] = "3px" self.Okn_8["relief"] = "sunken" ft = tkFont.Font(family='Times',size=18) self.Okn_8["font"] = ft self.Okn_8["bg"] = "white" self.Okn_8["fg"] = "black" self.Okn_8["justify"] = "center" self.Okn_8["text"] = "* результат *" ## self.Okn_8.place(x=490,y=130,width=100,height=30) self.Okn_8.grid(row=3, column=1,sticky=NSEW,padx=5, pady=5) # имеет методы(или команды) доступные для других def show_new_data(self, data): # показать в текстовом поле данные self.Okn_2.delete(1.0, 'end') self.Okn_2.insert(1.0, data) self.Okn_4.delete(1.0, 'end') self.Okn_4.insert(1.0, data) def get_data(self): # вернуть данные из строки ввода return self.Okn_2.get() return self.Okn_4.get() # процессор class Processor: def sum(self) return Okn_6=Okn_2+Okn_4 def umn(self) return Okn_8=Okn_2*Okn_4 # объединяющее пространство class Program: def __init__(self): self.app = Okno() self.pr = Processor if __name__ == "__main__": root = tk.Tk() app = Okno(root) root.mainloop()
Отредактировано urandart (Март 10, 2023 17:08:18)
Офлайн