Разделение кода в питоне

Можно ли разделить код 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», чтобы переменные не обязательно должны быть скопированы в основную программу,
  • Чтобы повторно использовать переменные, хранящиеся в модулях, инициализируйте переменные и используйте функции геттера и сеттера. Функции сеттера объявили бы переменные как глобальные.

Источник

Оцените статью