Найти - Пользователи
Полная версия: Соединение gui и исполняемого кода.
Начало » Python для новичков » Соединение gui и исполняемого кода.
1 2
urandart
Здравствуйте.
Написал простейшую программу, “calcpy123”.
Создал в qtdesinger три оболочки, под эту программу, “calcpy1”, “calcpy2”, “calcpy3”.
Не знаю как их соединить в единый исполняемый файл:
main1 = calcpy123 + calcpy1
main2 = calcpy123 + calcpy2
main3 = calcpy123 + calcpy3
* в calcpy1 результаты должны автоматически обновляться при изменении входных данных
* в calcpy2 результаты обновляются только после нажатия своей кнопки, остальные результаты остаются неизменными не зависимо от перемены входных данных.
* в calcpy3 меняются сразу все результаты по нажатию кнопки.
Надписи на кнопке получилось сделать в несколько рядов только отдельными блоками, при наведении и попадание курсора на надписи курсора (в границах блока слова), кнопка не срабатывает.
urandart
Здесь помогли человеку разобраться с похожим вопросом. Только у него знаний и понимания больше было чем у меня сейчас.
В QtDesinger есть “edit signal/slot”. Попробую хотя бы с этим самостоятельно разобраться (надеюсь получится), пока никто не откликнулся.
xam1816
urandart
* в calcpy1 результаты должны автоматически обновляться при изменении входных данных
* в calcpy2 результаты обновляются только после нажатия своей кнопки, остальные результаты остаются неизменными не зависимо от перемены входных данных.
* в calcpy3 меняются сразу все результаты по нажатию кнопки.

такое примерно делал на штатном tkinter
urandart
xam1816
Мне не принципиально на чем основана графика.
Просто в qtdesinger, для меня все наглядно, в плане дизайна.
Изначально gui начинал делать в tkinter и тоже застопорился на шаге соединения окна и кода,
переключился на qtdesinger, думал там будет проще, но результат тот же и на том же этапе.
Пока для меня тупик.
Я хочу разобраться, понять в принципе вообще как это делается.
Если не затруднит напиши примеры соединения gui и кода основанные на моем дизайне и коде в tkinter.
xam1816
urandart
Изначально gui начинал делать в tkinter и тоже застопорился на шаге соединения окна и кода,

Я пользуюсь таким принципом

есть три отельные части:
1 Интерфейс, графическая оболочка
2 Процессор, обработчик информации
3 Пространство, где инициализируются интерфейс и процессор, т.е общее пространство для них, где они могут видеть друг друга и пользоваться методами друг друга.

например:

  
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()
urandart
xam1816
Есть какая то разница в порядке расположения указанных вами частей кода. К примеру, можно поменять 1 и 2 пункт местами, или 1 и 3?
Как я понимаю код всегда выполняется сверху в низ, 3 пункт должен быть всегда последним, а вот 1 и 2 можно поменять местами. Ведь по сути все равно, что первым выполнится рисование или вычисление, главное что связка будет последней. Или я не прав?
xam1816
urandart
Ведь по сути все равно, что первым выполнится рисование или вычисление, главное что связка будет последней.

сначала мы что-то объявляем: класс, функцию, переменную, потом используем.

функция выполняется тогда, когда идут () после имени.Т.е мы не можем ее выполнить, пока не объявим ранее, что она есть
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
код программы для этого 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
urandart
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()
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