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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: چگونه بفهمم برنامه در Browser اجرا شده یا Desktop (حل شد)  (دفعات بازدید: 1980 بار)

0 کاربر و 3 مهمان درحال مشاهده موضوع.

آفلاین { AliReaza }

  • Hero Member
  • *
  • ارسال: 866
  • جنسیت : پسر
  • اگه کفشت پاتو می زد و از ترس قضاوت مردم پابرهنه نشدی و درد رو به پات تحمیل کردی، دیگر در مورد آزادی شعار نده...
سلام دوستان

دارم برای آزمایش، یک برنامه کوچولو که فقط یک متن ساده نمایش میده با 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/
« آخرین ویرایش: 21 تیر 1394، 10:54 ب‌ظ توسط { AliReaza } »

آفلاین احمد حمزه ئی

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
    • Github
اگر در Desktop اجرا شده باشه از کتابخانه Qt استفاده کنه.
اگر در Browser اجرا شده باشه از کتابخانه Django استفاده کنه.

اصلا چرا باید همچین کاری کرد؟
شما برنامه رو با Django و سایر تکنولوژی های مربوط به وب می نویسید.
بعد روی وب سرور اجراش می کنید تا کاربر از طریق مرورگر به برنامه دسترسی داشته باشه.
همچنین می تونید با webkit برنامه رو شبیه یه برنامه دسکتاپ تو پنجره مجزا اجرا کنید.

آفلاین { AliReaza }

  • Hero Member
  • *
  • ارسال: 866
  • جنسیت : پسر
  • اگه کفشت پاتو می زد و از ترس قضاوت مردم پابرهنه نشدی و درد رو به پات تحمیل کردی، دیگر در مورد آزادی شعار نده...
خیلی ممنون از پیشنهادی که دادید

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

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

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

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

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


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

مثل JavaScript یا PHP که میشه فهمید که کاربر از چه Device یا Browser استفاده میکنه و بسته به شرایط خروجی مناسب را اعمال کرد.

آفلاین احمد حمزه ئی

  • Jr. Member
  • *
  • ارسال: 66
  • جنسیت : پسر
    • Github
اما نکته ای که وجود داره اینه که ممکن به هر دلیلی، امکان ایجاد 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 اینجا گفته شده
روشش اینطوریه که متغیر GATEWAY_INTERFACE چک میشه، با پایتون احتمالا اینطوری میشه:
import os
if(os.environ.get('GATEWAY_INTERFACE') == None):
print("running from desktop")
else:
print("running from browser")

آفلاین { AliReaza }

  • Hero Member
  • *
  • ارسال: 866
  • جنسیت : پسر
  • اگه کفشت پاتو می زد و از ترس قضاوت مردم پابرهنه نشدی و درد رو به پات تحمیل کردی، دیگر در مورد آزادی شعار نده...
به طور کلی شرطی وجود داره که بشه فهمید برنامه از کجا داره اجرا میشه؟ ( Desktop یا Browser )
یه روش برای perl اینجا گفته شده
روشش اینطوریه که متغیر GATEWAY_INTERFACE چک میشه، با پایتون احتمالا اینطوری میشه:
import os
if(os.environ.get('GATEWAY_INTERFACE') == None):
print("running from desktop")
else:
print("running from browser")
آقا دمت گرم

به زیبایی کار میکنه.  \\:D/

آفلاین alireza.crs

  • Sr. Member
  • *
  • ارسال: 491
  • جنسیت : پسر
اما نکته ای که وجود داره اینه که ممکن به هر دلیلی، امکان ایجاد 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 اینجا گفته شده
روشش اینطوریه که متغیر GATEWAY_INTERFACE چک میشه، با پایتون احتمالا اینطوری میشه:
import os
if(os.environ.get('GATEWAY_INTERFACE') == None):
print("running from desktop")
else:
print("running from browser")
این کار تو ویندوز یا مک هم جواب میده؟

آفلاین { AliReaza }

  • Hero Member
  • *
  • ارسال: 866
  • جنسیت : پسر
  • اگه کفشت پاتو می زد و از ترس قضاوت مردم پابرهنه نشدی و درد رو به پات تحمیل کردی، دیگر در مورد آزادی شعار نده...
این کار تو ویندوز یا مک هم جواب میده؟
تا اونجا که من میدونم و مطالعه کردم و همه میگن

Python یک زبان Cross-Platform هست. در نتیجه باید در همه جا کار کنه.

آفلاین AAAAAAAAAAAAAAAAAAAA

  • High Sr. Member
  • *
  • ارسال: 506
  • :(
اما نکته ای که وجود داره اینه که ممکن به هر دلیلی، امکان ایجاد 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 اینجا گفته شده
روشش اینطوریه که متغیر 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) تعیین میشه
ولی ویندوز فکر نکنم اصلا همچین چیزی داشته باشه اگرم داشته باشه معلوم نیست اسمش دقیقا این باشه.