Взаимосвязь интерфейса, его разработки и кода программы
Сразу прошу прощения, если я путаю термины и названия.
В общем, у меня проблема: не до конца понимаю связь кода с интерфейсом. Я вроде понял, как пользоваться TKinter'ом, но в какой-то момент подумал "Ведь должны быть более простые способы реализации интерфейса и к тому же, более привлекательного".
Нашел в сети приложения для разработки интерфейса, моем случае это Pixate. Открыл я его, понаставил пару объектов и... Все. Что дальше? Как использовать его в программе?
Прочитал что-то про конвертацию файла из .ui в .py в этой https://tproger.ru/translations/python-gui-pyqt/ статье, но здесь разобран случай использования PtQt и Qt Designer.
Получается, Qt Designer + PtQt = TKinter? Но это значит, что библиотека имеет свою собственную среду разработки UI, привязанную к этой самой библиотеке? Тогда как использовать остальные программы по типу Pixate?
Итак, у меня есть код, но его длина почти 160 строк, поэтому покажу фрагмент.
stop_word='продолжить'
while stop_word!='выйти':
if stop_word=='продолжить':
par_code_1=input("Введите первый родительский генетический код ")
while len(par_code_1)%2!=0:
print('----ОШИБКА----')
print('Длина кода не может быть нечетной')
print()
par_code_1=input("Введите первый родительский генетический код ")
par_code_2=input("Введите второй родительский генетический код ")
while len(par_code_2)%2!=0:
print('----ОШИБКА----')
print('Длина кода не может быть нечетной')
print()
par_code_2=input("Введите второй родительский генетический код ")
if len(par_code_1)!=len(par_code_2):
while len(par_code_1)!=len(par_code_2):
print('----ОШИБКА----')
print('Оба кода должны иметь одинаковую длину')
print()
par_code_1=(input("Введите первый родительский генетический код "))
while len(par_code_1)%2!=0:
print('----ОШИБКА----')
print('Длина кода не может быть нечетной')
print()
par_code_1=input("Введите первый родительский генетический код ")
par_code_2=input("Введите второй родительский генетический код ")
while len(par_code_2)%2!=0:
print('----ОШИБКА----')
print('Длина кода не может быть нечетной')
print()
par_code_2=input("Введите второй родительский генетический код ")
print(par_code_1)
print(par_code_2)
Да, скорее всего, его можно сильно укоротить, только не бейте пожалуйста.
А вот по сути тот же самый фрагмент, но уже имеющий полноценное окно, поля и кнопки для работы (он не доработан, в нем есть ошибка, но, тем не менее, суть работы он отображает).
from tkinter import *
def clicked_1():
global a1, status_1
a1=input_window_1.get()
status_1=0
if len(a1)%2!=0:
input_msg_1.configure(text='Введите первый родительский генетический код\n'
'Длина кода не может быть нечетной',fg='red')
elif len(a1)%2==0:
input_msg_1.configure(text='Введите первый родительский генетический код\n',
fg='black')
status_1=1
clicked_both()
return(a1)
def clicked_2():
global a2, status_2
a2=input_window_2.get()
status_2=0
if len(a2)%2!=0:
input_msg_2.configure(text='Введите второй родительский генетический код\n'
'Длина кода не может быть нечетной',fg='red')
elif len(a2)%2==0:
input_msg_2.configure(text='Введите второй родительский генетический код\n',
fg='black')
status_2=1
clicked_both()
return(a2)
def clicked_both():
if status_1==1 and status_2==1:
if len(a1)!=len(a2):
error_window_1.configure(text='Оба кода должны иметь одинаковую длину',
fg='red')
elif len(a1)==len(a2):
error_window_1.configure(text='')
window = Tk()
window.title('Code Calculator')
window.geometry('600x400')
input_msg_1=Label(window,text='Введите первый родительский генетический код\n')
input_msg_1.grid(column=0,row=0)
input_msg_2=Label(window,text='Введите второй родительский генетический код\n')
input_msg_2.grid(column=0,row=1)
input_window_1=Entry(window,width=10)
input_window_1.grid(column=1,row=0)
input_window_2=Entry(window,width=10)
input_window_2.grid(column=1,row=1)
code_check_1=Button(window,text='Проверить',command=clicked_1)
code_check_1.grid(column=2,row=0)
code_check_2=Button(window,text='Проверить',command=clicked_2)
code_check_2.grid(column=2,row=1)
error_window_1=Label(window,text='')
error_window_1.grid(column=0,row=2)
В общем, главный мой вопрос: можно ли разработать для этого куска полноценный, не выглядящий как программа из 90-х, интерфейс, если это можно так назвать в данном случае, с помощью Pixate или подобных программ?
Ответы (1 шт):
(Qt Designer + PtQt) != TKinter
Прежде чем запустить мой пример, убедитесь, что вы установили PyQt5
pip install PyQt5
pip install pyqt5-tools
PyQt — реализация фреймворка Qt для языка Python.
В GUI с использованием PyQt5, ваша задача может выглядеть примерно так:
import sys
from PyQt5.QtWidgets import QMainWindow, QWidget, QLabel, QLineEdit, \
QTextEdit, QPushButton, QGridLayout, QMessageBox, QApplication
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget()
self.setCentralWidget(self.centralWidget)
self.errorFlag = False
label_1 = QLabel("Введите первый <br>родительский генетический код.")
label_2 = QLabel("Введите второй <br>родительский генетический код.")
self.lineEdit_1 = QLineEdit()
self.lineEdit_2 = QLineEdit()
self.textEdit = QTextEdit()
button = QPushButton("Click me")
button.clicked.connect(self.onClicked)
grid = QGridLayout(self.centralWidget)
grid.addWidget(label_1, 0, 0)
grid.addWidget(self.lineEdit_1, 0, 1)
grid.addWidget(label_2, 1, 0)
grid.addWidget(self.lineEdit_2, 1, 1)
grid.addWidget(self.textEdit, 2, 0, 1, 2)
grid.addWidget(button, 3, 1)
def onClicked(self):
self.errorFlag = False
text_1 = self.lineEdit_1.text()
text_2 = self.lineEdit_2.text()
if (len(text_1) % 2) != 0 or (not text_1):
self.errorMsg("Длина первого кода не может быть нечетной.")
if (len(text_2) % 2) != 0 or (not text_2):
self.errorMsg("Длина второго кода не может быть нечетной.")
if len(text_1) != len(text_2):
self.errorMsg("Оба кода должны иметь одинаковую длину.")
if not self.errorFlag:
self.run()
def errorMsg(self, text):
msg = QMessageBox.information(
self,
"Внимание!",
text
)
self.errorFlag = True
def run(self):
self.textEdit.append("Контроль ввода кода - пройден. Делайте что-нибудь.")
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
