- Можно ли разделить код GUI и обработчика событий в разные файлы? (Python, PyQt5)
- Python 3 как правильно разделить на файлы программу
- 1 ответ 1
- Эффективное разделение команд в Python: примеры и рекомендации
- Использование функций
- Использование классов
- Использование модулей
- Конкретные рекомендации
- Вывод
- разделить исходный код Python на несколько файлов?
- 4 ответа
Можно ли разделить код GUI и обработчика событий в разные файлы? (Python, PyQt5)
Пытаюсь отделить код интерфейса приложения и обработчиков событий для читабельности и удобства. Проблема в том, что обработчики событий оперируют элементами GUI и при запуске программы выдается ошибка о том, что элемент используемый в обработчике не определен, но он определен в модуле GUI. GUI_modul.py
from PyQt5 import QtWidgets, QtGui, QtCore, QtSql import sys from modul1 import input_cliced app = QtWidgets.QApplication(sys.argv) ########################################################### ######## Стартовое окно ############ ########################################################### start_window = QtWidgets.QWidget() start_window.setWindowTitle('База приборов') button_input = QtWidgets.QPushButton('Внести новый прибор') button_input.clicked.connect(input_cliced) start_layout = QtWidgets.QGridLayout() start_layout.addWidget(button_input) start_window.setLayout(start_layout) ########################################################### ######## Окно ввода информации о новом приборе ############ ########################################################### input_window = QtWidgets.QWidget() input_window.setWindowTitle('Ввод нового прибора') input_window.resize(QtCore.QSize(1000,300)) ###Поля ввода информации в окне ввода input_layout = QtWidgets.QGridLayout() input_place_devprod = QtWidgets.QLineEdit() input_place_devmode = QtWidgets.QLineEdit() input_place_devSN = QtWidgets.QLineEdit() input_submit_btn = QtWidgets.QPushButton('Input') ###Добавление полей ввода в слой окна ввода данных input_layout.addWidget(lable_devprod) input_layout.addWidget(input_place_devprod) input_layout.addWidget(input_place_devmode) input_layout.addWidget(input_place_devSN) input_layout.addWidget(input_submit_btn) ###Передача слоя в окно ввода данных input_window.setLayout(input_layout) start_window.show() sys.exit(app.exec_())
from PyQt5 import QtWidgets def input_cliced (): input_window.show()
start_window запускается, но при нажатии на button_input вылетает ошибка о том, что input_window не определен, но он определен в первом модуле. Вопрос — как сделать чтобы модули видели объекты друг друга? (Среда Visual Studio)
Python 3 как правильно разделить на файлы программу
я бы запуск из __init__.py в main.py перенес и перенес код в if __name__ == ‘__main__’: , вам ведь не нужно чтобы при импорте приложение запустилось?
У вас в файле widgets.py имя аргумента tk совпадает с именем модуля tk, исправьте в первую очередь это
1 ответ 1
import gui def sumbit(event): result = findX(win.variable) if(result == 'Error'): win.ResultLabel['text'] = 'a - не может равнятся 0' else: win.ResultLabel['text'] = 'x1 = , x2 = '.format(result[0],result[1]) def findX(variable): try: D = (variable['b'].get() ** 2) - (4 * variable['a'].get() * variable['c'].get()) x1 = (-variable['b'].get() + (D ** 0.5)) / (2 * variable['a'].get()) x2 = (-variable['b'].get() - (D ** 0.5)) / (2 * variable['a'].get()) return [x1,x2] except ArithmeticError: return 'Error' win = gui.gui() win.btn.bind("",sumbit) win.root.mainloop()
import tkinter as tk class gui: def __init__(self): self.root = tk.Tk() self.declareWidget() self.placeWidget() def declareWidget(self): #Labels self.FirstLabel = tk.Label(self.root, text="x^2 + ", font="Arial 18") self.SecondLabel = tk.Label(self.root, text="x + ", font="Arial 18") self.ResultTextLabel = tk.Label(self.root, text = "Результат: ", font = "Arial 12") self.ResultLabel = tk.Label(self.root, text = "", font = "Arial 12") #Entrys self.variable = self.EntryA = tk.Entry(self.root, width=5, bd=3, textvariable=self.variable['a']) self.EntryB = tk.Entry(self.root, width=5, bd=3, textvariable=self.variable['b']) self.EntryC = tk.Entry(self.root, width=5, bd=3, textvariable=self.variable['c']) #Button self.btn = tk.Button(self.root,text="Решить") def placeWidget(self): # Labels self.FirstLabel.grid(column=1,row=0) self.SecondLabel.grid(column=3,row=0) self.ResultTextLabel.grid(column = 2, row = 2) self.ResultLabel.grid(column = 2, row = 3) #Entrys self.EntryA.grid(column=0,row=0) self.EntryB.grid(column=2,row=0) self.EntryC.grid(column=4,row=0) #Buttons self.btn.grid(column=2,row = 1)
Эффективное разделение команд в Python: примеры и рекомендации
Разделение команд — важная составляющая написания чистого, понятного и структурированного кода в Python. Организация ваших команд по логическим блокам может помочь вам разбить сложные задачи на более маленькие и управляемые части, что в свою очередь упрощает последующее тестирование, отладку и сопровождение вашего кода. В этой статье мы рассмотрим несколько примеров разделения команд, а также дадим рекомендации по тому, как лучше организовать ваш код в Python.
Использование функций
Одним из наиболее распространенных способов разделения команд в Python является использование функций. Функции помогают группировать связанный код в отдельные, самодостаточные блоки, которые могут быть вызваны из любой точки вашей программы. Кроме того, использование функций упрощает переиспользование кода, поскольку вы можете вызвать одну и ту же функцию из нескольких мест в вашей программе.
def calculate_sum(a, b): result = a + b return result num1 = 5 num2 = 10 total = calculate_sum(num1, num2) print(total) # выведет 15
Использование классов
Если вы работаете с большим и сложным проектом, использование классов может быть более эффективным способом разделения команд. Классы позволяют объединять функции и переменные, связанные с определенным объектом или процессом, в одном месте. Кроме того, они позволяют легко создавать несколько экземпляров одного и того же объекта, что упрощает портирование вашей программы в различные среды или использование ее в нескольких проектах.
class Car: def __init__(self, make, model, year): self.make = make self.model = model self.year = year def start_engine(self): print("Starting the engine. ") my_car = Car("Toyota", "Corolla", 2021) my_car.start_engine() # выведет "Starting the engine. "
Использование модулей
Модули позволяют группировать связанный код в одном файле, который может быть импортирован в другие части вашей программы. Использование модулей может помочь упростить ваш код, уменьшить вероятность конфликта имен и повторное использование кода.
# car.py class Car: def __init__(self, make, model, year): self.make = make self.model = model self.year = year def start_engine(self): print("Starting the engine. ") # main.py from car import Car my_car = Car("Toyota", "Corolla", 2021) my_car.start_engine() # выведет "Starting the engine. "
Конкретные рекомендации
Хотя нет одного «правильного» способа разделения команд в Python, есть несколько рекомендаций, которые могут помочь упростить ваш код и сделать его более эффективным:
- Используйте функции, чтобы группировать связанный код в отдельных блоках, и помещайте эти функции в отдельные файлы, если они являются самодостаточными.
- Используйте классы, чтобы объединить функции и переменные, связанные с определенным объектом или процессом, в одном месте.
- Используйте модули, чтобы группировать связанный код в одном файле и уменьшить вероятность конфликта имен.
- Используйте именование, чтобы помочь организовать ваш код. Называйте функции и переменные ясно и описательно, чтобы вы и другие разработчики могли легко понять, что они делают.
- Пишите код так, чтобы он был легко читаемым. Используйте отступы, чтобы выделить блоки кода и сделать их более понятными.
Вывод
Разделение команд является важной частью написания хорошо организованного, понятного и легко поддерживаемого кода в Python. Функции, классы и модули — это три распространенных способа разделения команд в Python, и каждый из них имеет свои преимущества и недостатки. Независимо от того, какой способ вы выберете, важно следовать приведенным рекомендациям, чтобы упростить ваш код и сделать его более эффективным и понятным.
разделить исходный код Python на несколько файлов?
У меня есть код, который я хочу разделить на несколько файлов. В Matlab можно просто вызвать файл .m , и до тех пор, пока он не определен как что-либо в частности, он просто запустится так, как если бы он был частью вызываемого кода. Пример (отредактированный):
test.m (matlab)
function [] = test() . some code using variables . test2
. some more code using same variables .
Вызов test запускает код в тесте, а также код в test2. Есть ли аналогичный способ для python поместить . some more code . во внешний файл, который будет просто читаться так, как если бы он находился в файле, из которого он вызван?
Да, вы можете разделить файлы на несколько модулей и импортировать то, что вам нужно. docs.python.org/tutorial/modules.html
4 ответа
Я изучаю использование модуля в python только сейчас и думал, что отвечу на вопрос, который Маркус просит в комментариях выше ( «Как импортировать переменные, когда они встроены в модули?» ) с двух сторон:
Вот как я переписал основную программу f1.py, чтобы продемонстрировать повторное использование переменной для Markus:
import f2 myStorage = f2.useMyVars(0) # initialze class and properties for i in range(0,10): print "Hello, " f2.print_world() myStorage.setMyVar(i) f2.inc_gMyVar() print "Display class property myVar:", myStorage.getMyVar() print "Display global variable gMyVar:", f2.get_gMyVar()
Вот как я могу переписать повторно используемый модуль f2.py:
# Module: f2.py # Example 1: functions to store and retrieve global variables gMyVar = 0 def print_world(): print "World!" def get_gMyVar(): return gMyVar # no need for global statement def inc_gMyVar(): global gMyVar gMyVar += 1 # Example 2: class methods to store and retrieve properties class useMyVars(object): def __init__(self, myVar): self.myVar = myVar def getMyVar(self): return self.myVar def setMyVar(self, myVar): self.myVar = myVar def print_helloWorld(self): print "Hello, World!"
Когда выполняется f1.py, это будет выглядеть так:
%run "f1.py" Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! Display class property myVar: 9 Display global variable gMyVar: 10
Я думаю, что точка Маркуса была бы следующей:
- Чтобы повторно использовать код модуля более одного раза, введите код модуля в функций или классов,
- Чтобы повторно использовать переменные, хранящиеся как свойства в модулях, инициализируйте свойства внутри класса и добавить методы «getter» и «setter», чтобы переменные не обязательно должны быть скопированы в основную программу,
- Чтобы повторно использовать переменные, хранящиеся в модулях, инициализируйте переменные и используйте функции геттера и сеттера. Функции сеттера объявили бы переменные как глобальные.