انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: { AliReaza } در 21 تیر 1394، 01:50 ب‌ظ

عنوان: چگونه بفهمم برنامه در Browser اجرا شده یا Desktop (حل شد)
ارسال شده توسط: { AliReaza } در 21 تیر 1394، 01:50 ب‌ظ
سلام دوستان

دارم برای آزمایش، یک برنامه کوچولو که فقط یک متن ساده نمایش میده با Python می نویسم.

می خوام این برنامه را جوری بنویسم که اگر کاربر برنامه را اجرا کرد بهش پیغام بده.

اما نیاز دارم که بفهمم که برنامه در کجا اجرا شده

اگر در Desktop اجرا شده باشه از کتابخانه Qt استفاده کنه.
اگر در Browser اجرا شده باشه از کتابخانه Django استفاده کنه.

Source برنامه:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os

if(os.environ.get("GATEWAY_INTERFACE") == None):
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *

QTextCodec.setCodecForTr(QTextCodec.codecForName("utf-8"))
QTextCodec.setCodecForCStrings(QTextCodec.codecForName("UTF-8"))

# Create an PyQT4 application object.
a = QApplication(sys.argv)   
   
# The QWidget widget is the base class of all user interface objects in PyQt4.
w = QMainWindow()
# Set window title 
w.setWindowTitle("سلام دنیا")
# Set window size.
w.resize(250, 75)

# Create main menu
mainMenu = w.menuBar()
fileMenu = mainMenu.addMenu("&مدیریت")

# Add exit button
exitButton = QAction(QIcon("exit24.png"), "خروج", w)
exitButton.setShortcut("Ctrl+Q")
exitButton.setStatusTip("خروج از برنامه")
exitButton.triggered.connect(w.close)
fileMenu.addAction(exitButton)

# Add a button
btn = QPushButton("سلام. این برنامه در میزکار اجرا شده است.", w)
btn.setToolTip("خروج از برنامه")
btn.clicked.connect(exit)
btn.resize(btn.sizeHint())
btn.move(10, 30)

# Show window
w.show()
sys.exit(a.exec_())
else:
# enable debugging
import cgitb
cgitb.enable()

print "Content-Type: text/html;charset=utf-8\n"
print

print "<html>\n"
print "<head>\n"
print "<title>سلام دنیا</title>\n"
print "</head>\n"
print "<body>\n"
print "سلام. این برنامه در مرورگر اجرا شده است.\n"
print "</body>\n"
print "</html>\n"

در خط شماره ۴ نیاز به شرط دارم، اما نمی دونم چی باید بذارم. البته گشتم اما به نتیجه نرسیدم.

−−−−−ویرایش−−−−−

شرط مورد نیاز اضافه شد.

با تشکر از " احمد حمزه ئی "  \\:D/
عنوان: پاسخ : چگونه بفهمم برنامه در Browser اجرا شده یا Desktop
ارسال شده توسط: احمد حمزه ئی در 21 تیر 1394، 04:49 ب‌ظ
اگر در Desktop اجرا شده باشه از کتابخانه Qt استفاده کنه.
اگر در Browser اجرا شده باشه از کتابخانه Django استفاده کنه.

اصلا چرا باید همچین کاری کرد؟
شما برنامه رو با Django و سایر تکنولوژی های مربوط به وب می نویسید.
بعد روی وب سرور اجراش می کنید تا کاربر از طریق مرورگر به برنامه دسترسی داشته باشه.
همچنین می تونید با webkit برنامه رو شبیه یه برنامه دسکتاپ تو پنجره مجزا اجرا کنید.
عنوان: پاسخ : چگونه بفهمم برنامه در Browser اجرا شده یا Desktop
ارسال شده توسط: { AliReaza } در 21 تیر 1394، 06:34 ب‌ظ
خیلی ممنون از پیشنهادی که دادید

اما نکته ای که وجود داره اینه که ممکن به هر دلیلی، امکان ایجاد web server وجود نداشته باشه.

در نتیجه باید امکان استفاده از برنامه با ساختار Desktop هم وجود داشته باشه.

اما دلیل من برای این کار اینه که:
ممکنه نیاز باشه یک برنامه را هم تحت Desktop و هم تحت Web نوشت.
نکته ای که در اینجا وجود داره یکسان بود برنامه هست. و تنها قسمتی که در برنامه تفاوت ایجاد میکنه، مربوط به نحوه نمایش یا همان خروجی هست.

فرض کنید می خواید یک تقویم بنویسید:
کله برنامه از نظر تبدیل و محاسبه و غیره کاملا یکسان هست.
و فقط خروجی فرق میکنه. که Django باشه یا Qt

البته میشه قسمت مشترک برنامه را به صورت کتابخانه نوشت و برای خروجی ها جدا نوشت. ( که مطمئنا باعث سبکتر شدن برنامه میشه. )


اما فقط برای من آزمایش کردن این روش مهمه. اصلا میشه این کار را کرد یا نه؟ (اینکه این روش درست هست یا نه برای من مهم نیست، فقط قصد آزمایش دارم.)
به طور کلی شرطی وجود داره که بشه فهمید برنامه از کجا داره اجرا میشه؟ ( Desktop یا Browser )

مثل JavaScript یا PHP که میشه فهمید که کاربر از چه Device یا Browser استفاده میکنه و بسته به شرایط خروجی مناسب را اعمال کرد.
عنوان: پاسخ : چگونه بفهمم برنامه در Browser اجرا شده یا Desktop
ارسال شده توسط: احمد حمزه ئی در 21 تیر 1394، 09:37 ب‌ظ
اما نکته ای که وجود داره اینه که ممکن به هر دلیلی، امکان ایجاد web server وجود نداشته باشه.
میشه وب سرور رو درون برنامه و توی یه thread جداگانه اجرا کرد و ازش استفاده کرد.
پس کاربر برای اجرای برنامه نیاز به اجرای وب سرور بصورت دستی نخواهد داشت.
مثلا این برنامه وب سرور داخلی flask رو اجرا میکنه و بعد توی webview برنامه ای که با flask نوشته شده رو نشون میده:
import threading
from gi.repository import Gtk, WebKit
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

def app_main():
    def flask_run():
        app.run()

    thread = threading.Thread(target=flask_run)
    thread.daemon = True
    thread.start()
   
    w = Gtk.Window(title="Hello", default_height=300, default_width=400)
    w.connect("delete-event", Gtk.main_quit)

    v = WebKit.WebView()
    sw = Gtk.ScrolledWindow()
    w.add(sw)
    sw.add(v)

    v.load_uri("http://127.0.0.1:5000/");
    w.show_all()

if __name__ == "__main__":
    app_main()
    Gtk.main()

به طور کلی شرطی وجود داره که بشه فهمید برنامه از کجا داره اجرا میشه؟ ( Desktop یا Browser )
یه روش برای perl اینجا گفته شده (http://stackoverflow.com/questions/3086655/how-to-distinguish-between-cli-cgi-modes-in-perl)
روشش اینطوریه که متغیر GATEWAY_INTERFACE چک میشه، با پایتون احتمالا اینطوری میشه:
import os
if(os.environ.get('GATEWAY_INTERFACE') == None):
print("running from desktop")
else:
print("running from browser")
عنوان: پاسخ : چگونه بفهمم برنامه در Browser اجرا شده یا Desktop
ارسال شده توسط: { AliReaza } در 21 تیر 1394، 09:56 ب‌ظ
به طور کلی شرطی وجود داره که بشه فهمید برنامه از کجا داره اجرا میشه؟ ( Desktop یا Browser )
یه روش برای perl اینجا گفته شده (http://stackoverflow.com/questions/3086655/how-to-distinguish-between-cli-cgi-modes-in-perl)
روشش اینطوریه که متغیر GATEWAY_INTERFACE چک میشه، با پایتون احتمالا اینطوری میشه:
import os
if(os.environ.get('GATEWAY_INTERFACE') == None):
print("running from desktop")
else:
print("running from browser")
آقا دمت گرم

به زیبایی کار میکنه.  \\:D/
عنوان: پاسخ : چگونه بفهمم برنامه در Browser اجرا شده یا Desktop (حل شد)
ارسال شده توسط: alireza.crs در 22 تیر 1394، 06:32 ب‌ظ
اما نکته ای که وجود داره اینه که ممکن به هر دلیلی، امکان ایجاد web server وجود نداشته باشه.
میشه وب سرور رو درون برنامه و توی یه thread جداگانه اجرا کرد و ازش استفاده کرد.
پس کاربر برای اجرای برنامه نیاز به اجرای وب سرور بصورت دستی نخواهد داشت.
مثلا این برنامه وب سرور داخلی flask رو اجرا میکنه و بعد توی webview برنامه ای که با flask نوشته شده رو نشون میده:
import threading
from gi.repository import Gtk, WebKit
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

def app_main():
    def flask_run():
        app.run()

    thread = threading.Thread(target=flask_run)
    thread.daemon = True
    thread.start()
   
    w = Gtk.Window(title="Hello", default_height=300, default_width=400)
    w.connect("delete-event", Gtk.main_quit)

    v = WebKit.WebView()
    sw = Gtk.ScrolledWindow()
    w.add(sw)
    sw.add(v)

    v.load_uri("http://127.0.0.1:5000/");
    w.show_all()

if __name__ == "__main__":
    app_main()
    Gtk.main()

به طور کلی شرطی وجود داره که بشه فهمید برنامه از کجا داره اجرا میشه؟ ( Desktop یا Browser )
یه روش برای perl اینجا گفته شده (http://stackoverflow.com/questions/3086655/how-to-distinguish-between-cli-cgi-modes-in-perl)
روشش اینطوریه که متغیر GATEWAY_INTERFACE چک میشه، با پایتون احتمالا اینطوری میشه:
import os
if(os.environ.get('GATEWAY_INTERFACE') == None):
print("running from desktop")
else:
print("running from browser")
این کار تو ویندوز یا مک هم جواب میده؟
عنوان: پاسخ : چگونه بفهمم برنامه در Browser اجرا شده یا Desktop (حل شد)
ارسال شده توسط: { AliReaza } در 22 تیر 1394، 07:04 ب‌ظ
این کار تو ویندوز یا مک هم جواب میده؟
تا اونجا که من میدونم و مطالعه کردم و همه میگن

Python یک زبان Cross-Platform هست. در نتیجه باید در همه جا کار کنه.
عنوان: پاسخ : چگونه بفهمم برنامه در Browser اجرا شده یا Desktop (حل شد)
ارسال شده توسط: AAAAAAAAAAAAAAAAAAAA در 22 تیر 1394، 08:34 ب‌ظ
اما نکته ای که وجود داره اینه که ممکن به هر دلیلی، امکان ایجاد web server وجود نداشته باشه.
میشه وب سرور رو درون برنامه و توی یه thread جداگانه اجرا کرد و ازش استفاده کرد.
پس کاربر برای اجرای برنامه نیاز به اجرای وب سرور بصورت دستی نخواهد داشت.
مثلا این برنامه وب سرور داخلی flask رو اجرا میکنه و بعد توی webview برنامه ای که با flask نوشته شده رو نشون میده:
import threading
from gi.repository import Gtk, WebKit
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

def app_main():
    def flask_run():
        app.run()

    thread = threading.Thread(target=flask_run)
    thread.daemon = True
    thread.start()
   
    w = Gtk.Window(title="Hello", default_height=300, default_width=400)
    w.connect("delete-event", Gtk.main_quit)

    v = WebKit.WebView()
    sw = Gtk.ScrolledWindow()
    w.add(sw)
    sw.add(v)

    v.load_uri("http://127.0.0.1:5000/");
    w.show_all()

if __name__ == "__main__":
    app_main()
    Gtk.main()

به طور کلی شرطی وجود داره که بشه فهمید برنامه از کجا داره اجرا میشه؟ ( Desktop یا Browser )
یه روش برای perl اینجا گفته شده (http://stackoverflow.com/questions/3086655/how-to-distinguish-between-cli-cgi-modes-in-perl)
روشش اینطوریه که متغیر GATEWAY_INTERFACE چک میشه، با پایتون احتمالا اینطوری میشه:
import os
if(os.environ.get('GATEWAY_INTERFACE') == None):
print("running from desktop")
else:
print("running from browser")
این کار تو ویندوز یا مک هم جواب میده؟
تو مک  میشه ولی تو ویندوز فکر نمیکنم (شایدم بشه ولی احتمالش خیلی پایینه)
----------
آخه این GATEWAY_INTERFACE از این environment هایی هست که تو POSIX باexport (تو sh) تعیین میشه
ولی ویندوز فکر نکنم اصلا همچین چیزی داشته باشه اگرم داشته باشه معلوم نیست اسمش دقیقا این باشه.