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

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

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

نویسنده موضوع: چگونه اسکریپت ها شل را در gtk اجرا کنیم؟ (how run scripts shell in gtk)  (دفعات بازدید: 7178 بار)

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

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
همه کاربران سلام

اگر دوستان در مورد gtk اطلاعات دارند لطفا بگویید که چگونه می توان اسکریپت های شل (مثلا sudo dpkg -i ****.deb )را با کد های gtk اجرا کرد
« آخرین ویرایش: 15 تیر 1388، 02:20 ب‌ظ توسط مهدی2 »

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1525
  • جنسیت : پسر
سلام
اگر دوستان در مورد gtk اطلاعات دارند لطفا بگویید که چگونه می توان اسکریپت های شل (مثلا sudo dpkg -i ****.deb )را با کد های gtk اجرا کرد
سوالتون واضح نیست.
1- توی چه زبانی می‌خواید؟ مثلاً C یا ++C یا پایتون؟ (توی هر زبانی می‌تونید یه دستور شل رو اجرا کنید و این ربطی به gtk و کلاً رابط گرافیکی نداره)
2- آیا می‌خواید چیزی شبیه ترمینال درست کنید که خروجی دستور رو به کاربر نشون بده؟ مثلاً شبیه PyGlossary
3- آیا می‌خواید ورودی هم از کاربر بگیره؟

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
اول سلام
می خوام توی زبان c باشه
در ضمن می خوام با کلیک کردن بروی یک button رمز کاربر root رو سوال کنه سپس این رمز به ترمینال بده تا بتونه دستورات زیر اجرا بشه
cd /media/cdrom0/packages

sudo dpkg -i /media/cdrom0/packages/ssl-cert_1.0.14-0ubuntu2.1_all.deb
sudo dpkg -i /media/cdrom0/packages/openssl-blacklist_0.3.3+0.4-0ubuntu0.8.04.3_all.deb

آفلاین فاراب

  • High Hero Member
  • *
  • ارسال: 1280
  • آزادی
    • وبسایت شخصی من (فعلا Down است)
اول سلام
می خوام توی زبان c باشه
در ضمن می خوام با کلیک کردن بروی یک button رمز کاربر root رو سوال کنه سپس این رمز به ترمینال بده تا بتونه دستورات زیر اجرا بشه
cd /media/cdrom0/packages

sudo dpkg -i /media/cdrom0/packages/ssl-cert_1.0.14-0ubuntu2.1_all.deb
sudo dpkg -i /media/cdrom0/packages/openssl-blacklist_0.3.3+0.4-0ubuntu0.8.04.3_all.deb


اینکار بوسیله‌ی تابع zenity در اسکریپت برای gtk انجام میشه. برای مثال:
zenity --entry --title="محل قرارگیری فایل" --text="آدرس فایل:" --entry-text="http://www."

نمونه‌اش هم اینجا هست:

برای اطلاع از چگونگی کارکردش، دستور به راهنما مراجعه کنید:
man zenity

اگر نتونستید اسکریپتش رُ بنویسید، بفرمایید تا کد رُ براتون بنویسم.
Godisnowhere

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
آقای فاراب سلام و تشکر از راهنماییتان
 لطفا به ایمیلتان سر بزنید
 
دستوری که گفته بودید برای ظاهر گرافیکی مورد نظر من مناسب نیست
 در ایمیلتان فایل اجرایی وفایل کد نویسی را گذاشته ام
منظور من این است که زمانی که بروی button-tavasol کلیک می کند یا برنامه sh.* اجرا شود ویا این دستور
( sudo dpkg -i /media/cdrom0/packages/linux-libc-dev_2.6.24-18.32_i386.deb)
اجرا شود وفایل اجرایی کل برنامه ساده باشد مثل فایل signal.out

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
همه کاربران  سلام
به از جستجوهای فراوان در اینترنت توانستم چند خط کد زیر را پیدا کنم .

        FILE *fp;
        gint exit_status;

        gchar *command = "???";

        /* execute command */
        fp = popen(command, "r");
    if (fp == NULL)
    {
                g_print("Error running %s", command);
    }
        exit_status = pclose (fp);
        g_print("Script exited with status %d", exit_status);

از این کد بیشتر برای سیگنال استفاده می شد.  در این کد بجای علامت سوال آدرس کامل فایل قرار میگیرد بطور مثال این آدرس
home/m/Desktop/xx.deb



حالا سوال دوم
با استفاده از رابط گرافیکی زیر چگونه میتوان رمز کاربر root گرفت وبه ترمینال داد(چگونه میتوان بارابط گرافیکی زیر وارد کاربر روت شد

http://upload.iranblog.com/6/1247180850.gif
« آخرین ویرایش: 18 تیر 1388، 04:48 ق‌ظ توسط مهدی2 »

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1525
  • جنسیت : پسر
همه کاربران  سلام
به از جستجوهای فراوان در اینترنت توانستم چند خط کد زیر را پیدا کنم .

        FILE *fp;
        gint exit_status;

        gchar *command = "???";

        /* execute command */
        fp = popen(command, "r");
    if (fp == NULL)
    {
                g_print("Error running %s", command);
    }
        exit_status = pclose (fp);
        g_print("Script exited with status %d", exit_status);

از این کد بیشتر برای سیگنال استفاده می شد.  در این کد بجای علامت سوال آدرس کامل فایل قرار میگیرد بطور مثال این آدرس
home/m/Desktop/xx.deb



حالا سوال دوم
با استفاده از رابط گرافیکی زیر چگونه میتوان رمز کاربر root گرفت وبه ترمینال داد(چگونه میتوان بارابط گرافیکی زیر وارد کاربر روت شد

http://upload.iranblog.com/6/1247180850.gif

بجای تابع popen از تابع system هم می‌تونید استفاده کنید.
برای انجام یه دستور با حساب root هم می‌تونید از gksu استفاده کنید.(اول همون دستور gksu و یه فاصله بذارید)

آفلاین فاراب

  • High Hero Member
  • *
  • ارسال: 1280
  • آزادی
    • وبسایت شخصی من (فعلا Down است)
همه کاربران  سلام
به از جستجوهای فراوان در اینترنت توانستم چند خط کد زیر را پیدا کنم .

        FILE *fp;
        gint exit_status;

        gchar *command = "???";

        /* execute command */
        fp = popen(command, "r");
    if (fp == NULL)
    {
                g_print("Error running %s", command);
    }
        exit_status = pclose (fp);
        g_print("Script exited with status %d", exit_status);

از این کد بیشتر برای سیگنال استفاده می شد.  در این کد بجای علامت سوال آدرس کامل فایل قرار میگیرد بطور مثال این آدرس
home/m/Desktop/xx.deb



حالا سوال دوم
با استفاده از رابط گرافیکی زیر چگونه میتوان رمز کاربر root گرفت وبه ترمینال داد(چگونه میتوان بارابط گرافیکی زیر وارد کاربر روت شد

http://upload.iranblog.com/6/1247180850.gif


خود دستور gksu اینکار رُ انجام میده. اگه هم خواستی میتونی اون تابع zenity که مقدار از کاربر میگیره رُ توی یه متغییر بریزی و با رمز عبور مقایسه کنی.
Godisnowhere

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
سلام
تشکر می کنم ازاین که پاسخ دادید
متاسفانه مشکل من با این کارها حل نشد
من می خوام یک پنجره که رمز عبور کاربر root رو بگیره و وارد کاربر روت بشه البته با ظاهر گرافیکی زیر
http://upload.iranblog.com/6/1247180850.gif
من ظاهر گرافیکی رو ساختم فقط مشکلم اینه که(به زبان ساده بگویم) چه کدی بنویسم که ابتدا عبارت  sudo -s -H تایپ کرد کلید اینتر را بزند ودر مقابل عبارت password عبارت تایپ شده در پنجره ( http://upload.iranblog.com/6/1247180850.gif ) قرار داده واینتر را بزند
البته عبارات زیر را در راهنماهای gtk که با بسته ی libgtk*doc نصب شده پیدا کردم ولی نمی دانم چطور باید استفاده کرد



   gnome_password_dialog_get_type (void);
GtkWidget* gnome_password_dialog_new      (const char *dialog_title,
   const char *message,
   const char *username,
   const char *password,
   gboolean    readonly_username);

gboolean   gnome_password_dialog_run_and_block           (GnomePasswordDialog *password_dialog);

/* Attribute mutators */
void gnome_password_dialog_set_show_username       (GnomePasswordDialog *password_dialog,
    gboolean             show);
void gnome_password_dialog_set_show_domain         (GnomePasswordDialog *password_dialog,
    gboolean             show);
void gnome_password_dialog_set_show_password       (GnomePasswordDialog *password_dialog,
    gboolean             show);
void gnome_password_dialog_set_username            (GnomePasswordDialog *password_dialog,
    const char          *username);
void gnome_password_dialog_set_domain              (GnomePasswordDialog *password_dialog,
    const char          *domain);
void gnome_password_dialog_set_password            (GnomePasswordDialog *password_dialog,
    const char          *password);
void gnome_password_dialog_set_readonly_username   (GnomePasswordDialog *password_dialog,
    gboolean             readonly);
void gnome_password_dialog_set_readonly_domain     (GnomePasswordDialog *password_dialog,
    gboolean             readonly);

void                        gnome_password_dialog_set_show_remember (GnomePasswordDialog         *password_dialog,
     gboolean                     show_remember);
void                        gnome_password_dialog_set_remember      (GnomePasswordDialog         *password_dialog,
     GnomePasswordDialogRemember  remember);
GnomePasswordDialogRemember gnome_password_dialog_get_remember      (GnomePasswordDialog         *password_dialog);
void                        gnome_password_dialog_set_show_userpass_buttons (GnomePasswordDialog         *password_dialog,
                                                                           gboolean                     show_userpass_buttons);

/* Attribute accessors */
char *     gnome_password_dialog_get_username            (GnomePasswordDialog *password_dialog);
char *     gnome_password_dialog_get_domain              (GnomePasswordDialog *password_dialog);
char *     gnome_password_dialog_get_password            (GnomePasswordDialog *password_dialog);

gboolean   gnome_password_dialog_anon_selected (GnomePasswordDialog *password_dialog);

وهمچنین
void e_passwords_init (void);

void        e_passwords_shutdown          (void);
void     e_passwords_cancel(void);
void        e_passwords_set_online(int state);
void        e_passwords_remember_password (const char *component, const char *key);
void        e_passwords_add_password      (const char *key, const char *passwd);
char       *e_passwords_get_password      (const char *component, const char *key);
void        e_passwords_forget_password   (const char *component, const char *key);
void        e_passwords_forget_passwords  (void);
void        e_passwords_clear_passwords (const char *component);

و در این صفحات یک مثال وجود دارد
http://gobby.0x539.de/trac/browser/src/passworddialog.cpp?rev=538eb0791fff0fe096872a736ce883fafcf485b3

http://www.tinymail.org/trac/tinymail/browser/trunk/libtinymailui-gtk/tny-gtk-password-dialog.c?rev=2825

« آخرین ویرایش: 23 تیر 1388، 05:56 ق‌ظ توسط مهدی2 »

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
دوستان سلام
کسی نیست جواب بده . کل کارم برای این دستور ایستاده لطفا هر نوع اطلاعاتی دارید بگید
سوالم اینطور حداقل می کنم که چطور دستورات
gnome_password_dialog_get_password (GnomePasswordDialog *password_dialog);  و
e_passwords_get_password      (const char *component, const char *key);
دریک برنامه gtk استفاده می شود.



آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
سلام
دوستان من که دیگر از این این انجمن تاحدودی  نامید شدم javascript:void(0);
حداقل بگوید برنامه های مانند  Synaptic چگونه وارد کاربر روت می شوند javascript:void(0);

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
دوستان سلام
شکر خدا تونستم با زیر ورو کردن gtk  مشکل رو برطرف کنم
جواب سوال این میشه که اگر بخواهیم با یک رابط گرافیکی  وارد کاربر روت شویم ویک فایل را با روت اجرا کنیم کافی است در ترمینال در ابتدای آدرس  فایل عبارت gksu را تایپ کنیم بطور مثال :
gksu  -- /home/m/Desktop/tavasol.sh

حالا سوالی دیگر دارم امید وارم بتوانید کمک کنید
من می خواهم یک ProgressBar ایجاد کنم که فقط نشانگر آن حرکت رفت و برگشت داشته با شد و با آغاز عملیات نصب شروع شود و با پایان نصب بسته شود
در زیر یک عکس گذاشتم شبیه اون چیزی که می خوام فقط عکس رو با مرور گر اینترنت باز کنید

http://www.Free-Picture-Host.com/images/vI8Wsz1250219992.gif
« آخرین ویرایش: 23 امرداد 1388، 06:52 ق‌ظ توسط مهدی2 »

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1525
  • جنسیت : پسر
حالا سوالی دیگر دارم امید وارم بتوانید کمک کنید
من می خواهم یک ProgressBar ایجاد کنم که فقط نشانگر آن حرکت رفت و برگشت داشته با شد و با آغاز عملیات نصب شروع شود و با پایان نصب بسته شود
در زیر یک عکس گذاشتم شبیه اون چیزی که می خوام فقط عکس رو با مرور گر اینترنت باز کنید

http://www.Free-Picture-Host.com/images/vI8Wsz1250219992.gif
باید با تابع gtk_progress_bar_pulse کار کنید. فعلاً یه چیزی نوشتم که کار می‌کنه. ولی روی زمان‌بندیش باید کار کنید(من همینطوری سمبل کردم! کلی پروسه می‌گیره). فکر می‌کنم باید از timeout_signal که توی glib هست استفاده کنید. در ضمن باید مثلاً با فشردن یه دکمه‌ای چیزی هم اون پنجره نشون داده بشه هم اینکه اون حلقه(که پالس می‌فرسته) شروع بشه. ولی من همینطوری قبل از gtk_main نوشتم‌ش.
// gcc `pkg-config --cflags --libs gtk+-2.0` progress.c -o progress
#include <stdlib.h>
#include <stdio.h>
#include <gtk/gtk.h>
//#include <time.h>


gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data){
    exit(0);
    //gtk_main_quit();
    return 1;
}


int main(int argc , char **argv){
  gtk_init(&argc, &argv);
  int i=0;
  GtkWidget *pbar, *win;
  pbar=gtk_progress_bar_new();
  win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  g_signal_connect(G_OBJECT(win), "delete_event", G_CALLBACK(delete_event), NULL);
  gtk_container_add(GTK_CONTAINER(win), pbar);
  gtk_widget_show_all(win);
  for(i=0;;i++){
    if(i%10000==0)
      gtk_progress_bar_pulse(GTK_PROGRESS_BAR(pbar));
    while(gtk_events_pending())
      gtk_main_iteration_do(0);
    //sleep(1);
    //printf("%d\n", i);
  }
  gtk_main();
  return 0;
}

آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
همه دوستان سلام
آقای ilius برنامه شما را امتحان کردم و متاسفانه برای تازکاری مثل من تغییر دادنش خیلی سخت است
برای ساخت پنجره مورد نظر از قسمت p..bar عکس گرفتم و این عکس را  به همراه label  در یک پنجره قرار دادم
حالا مشکل من این است که چگونه می توان فقط این پنجره وقتی که دستور قبلی اجرا شد بسته شود
 البته دستور gtk _mine_quit این کار را انجام می دهد ولی تمام پنجره های می بندد در صورتی که من می خواهم فقط یک پنجره بسته شود

void b23(GtkWidget *widget,gpointer data)
{
FILE *fp;
        gint exit_status;
        gchar *command = "gksu -- /home/m/Desktop/cd-tavasol/sh/opera.sh";

        fp = popen(command, "r");
    if (fp == NULL)
    {
                g_print("Error running %s", command);
    }
        exit_status = pclose (fp);
  gtk_main_quit();  
}
 



آفلاین مهدی2

  • Jr. Member
  • *
  • ارسال: 44
سلام
کسی نبود به من کمک کنه
سوالم این هست که می خوام وقتی توی کنسول تایپ شد(finish) سیگنالی ایجاد شود( که بتوانم برای کالبک آن دستور بسته شدن پنجره بنویسم)
FILE *fp;
        gint exit_status;
        gchar *command = "gksu -- /home/m/Desktop/cd-tavasol/sh/tavasol8.04LTS.sh";

        fp = popen(command, "r");
    if (fp == NULL)
    {
                g_print("Error running %s", command);
    }
        exit_status = pclose (fp);
        g_print("finish", exit_status);
« آخرین ویرایش: 28 امرداد 1388، 09:05 ب‌ظ توسط مهدی2 »