如何在 Gnome 应用程序中创建一个调用 api 的 Mainloop

问题描述

所以我试图在 GNOME 扩展中调用谷歌 API,我想知道为什么如果我尝试启用我的扩展它会导致 manjaro Linux 崩溃。如果我在做一些根本错误的事情,请通知我,因为我对此很陌生,即使我已经编程多年。 好的,我在下面添加我的代码

const Main = imports.ui.main;
const {St,clutter} = imports.gi;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Me = imports.misc.extensionUtils.getCurrentExtension();
const Mainloop = imports.mainloop;

let myPopup;
let panelButton;
const MyPopup = GObject.registerClass(
class MyPopup extends PanelMenu.Button {

 _init () {


    // let icon = new St.Icon({
    //   //icon_name : 'security-low-symbolic',//   gicon : Gio.icon_new_for_string( Me.dir.get_path() + '/icon.svg' ),//   style_class : 'system-status-icon',// });
    // this.add_child(icon);
    let panelButtonText = new St.Label({
        text : "Youtube Channel",y_align: clutter.ActorAlign.CENTER,});
    this.add_child(panelButtonText);
    
    let pmItem = new PopupMenu.PopupMenuItem('normal Menu Item');
    pmItem.add_child(new St.Label({text : 'Label added to the end'}));
    this.menu.addMenuItem(pmItem);

    pmItem.connect('activate',() => {
      log('clicked');
    });

    this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());

    this.menu.addMenuItem(
      new PopupMenu.PopupMenuItem(
        "User cannot click on this item",{reactive : false},)
    );

    this.menu.connect('open-state-changed',(menu,open) => {
      if (open) {
        log('opened');
      } else {
        log('closed');
      }
    });

    
    
    // sub menu
    let subItem = new PopupMenu.PopupSubMenuMenuItem('sub menu item');
    this.menu.addMenuItem(subItem);
    subItem.menu.addMenuItem(new PopupMenu.PopupMenuItem('item 1'));
    subItem.menu.addMenuItem(new PopupMenu.PopupMenuItem('item 2'),0);

    // section
    let popupMenuSection = new PopupMenu.PopupMenuSection();
    popupMenuSection.actor.add_child(new PopupMenu.PopupMenuItem('section'));
    this.menu.addMenuItem(popupMenuSection);

    // image item
    let popupImageMenuItem = new PopupMenu.PopupImageMenuItem(
      'Menu Item with Icon','security-high-symbolic',);
    this.menu.addMenuItem(popupImageMenuItem);

    // you can close,open and toggle the menu with
    // this.menu.close();
    // this.menu.open();
    // this.menu.toggle();
  }
  load_json_async(url,params,fun) {
    if (_httpSession === undefined) {
        _httpSession = new Soup.Session();
        _httpSession.user_agent = this.user_agent;
    } else {
        // abort prevIoUs requests.
        _httpSession.abort();
    }
  
    let message = Soup.form_request_new_from_hash('GET',url,params);
  
    _httpSession.queue_message(message,Lang.bind(this,function(_httpSession,message) {
        try {
            if (!message.response_body.data) {
                fun.call(this,0);
                return;
            }
            let jp = JSON.parse(message.response_body.data);
            fun.call(this,jp);
        } catch (e) {
            fun.call(this,0);
            return;
        }
    }));
    return;
  }
  // main() {

  //   var loop = new MainLoop();
  //   var time = new TimeoutSource(2000);

  //   time.set_callback(() => {
  //       stdout.printf("Time!\n");
  //       loop.quit();
  //       return false;
  //   });

  //   time.attach(loop.get_context());

  //   loop.run();
  // } 
});

const MyIcon = GObject.registerClass(
class MyIcon extends PanelMenu.Button {
    _init () {

    super._init(0);
    let icon = new St.Icon({
        //icon_name : 'security-low-symbolic',gicon : Gio.icon_new_for_string( Me.dir.get_path() + '/icon.svg' ),style_class : 'system-status-icon',});
    this.add_child(icon);
}
});
function init() {
    log("started init")
    // Mainloop.timeout_add(1000,() =>{

    //   log("one second later!")
    //   // load_json_async("https://www.googleapis.com/youtube/v3/channels?part=statistics&id=",{},function(json){
    //   //   log(data)
    //   // });
    // });
}

function enable() {
  myPopup = new MyPopup();
  log("started here")
  Main.panel.addToStatusArea('myPopup',myPopup,0);
//   const https = require('https');
//   log("started pulling data")
//   let timeout = Mainloop.timeout_add_seconds(10,() => {
//         https.get('https://www.googleapis.com/youtube/v3/channels?part=s',(resp) => {
//         let data = '';

//         // A chunk of data has been received.
//         resp.on('data',(chunk) => {
//             data += chunk;
//         });

//         // The whole response has been received. Print out the result.
//         resp.on('end',() => {
//             log(JSON.parse(data).explanation);
//         });

//         }).on("error",(err) => {
//             log("Error: " + err.message);
//         });
        
//   });
//   myIcon = new MyIcon();
//   log("started here")
//   Main.panel.addToStatusArea('myIcon',myIcon,-1);
}

function disable() {
  myPopup.destroy();
}

我尝试了几种方法来做到这一点,但我想知道我做错了什么。 非常感谢你们。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)