2011-11-14 18 views
5
  • python 3.2.2
  • gtk3 3.2.2
  • python-gobject 3.0.2

Tôi đang cố gắng để hiển thị một GUI và làm một số công việc trong nền. Vì tôi hiểu nó nên trông giống như sau:Python. Làm một số công việc trên nền với Gtk GUI

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 


import time 
from threading import Thread 
from gi.repository import Gtk, Gdk 

class Gui(): 
     def run(self): 
       self.Window = Gtk.Window() 
       self.Window.set_border_width(8) 
       self.Window.set_title("Некий GUI") 
       self.Window.connect('destroy', lambda x: self.stop()) 

       self.outBut = Gtk.Button.new_from_stock(Gtk.STOCK_OK) 
       self.outBut.set_size_request(150, 35) 
       self.outBut.connect('clicked', lambda x: self.passfun) 
       self.Window.add(self.outBut) 

       self.Window.show_all() 

     def stop(self): 
       Gtk.main_quit() 

     def passfun(self): 
       pass 

class LoopSleep(Thread): 
     def run(self): 
       i = 1 
       while True: 
         print(i) 
         i = i + 1 
         #time.sleep(1) 



gui = Gui() 
gui.run() 

loopSleep = LoopSleep() 
loopSleep.start() 

Gdk.threads_init() 
Gdk.threads_enter() 
Gtk.main() 
Gdk.threads_leave() 

Nhưng nó không hoạt động. Một số chu kỳ xảy ra khi bạn nhấn nút. Và chu trình chạy sau khi cửa sổ đóng lại. Nhưng không phải với nhau.

Tôi làm gì sai?

+0

Bạn nên bao gồm mã với câu hỏi của mình. –

+0

Tôi sử dụng pastebin, vì tôi không thể hiểu cách dán mã công việc tại đây. – Atterratio

+1

Bạn dán nó vào, chọn nó và nhấn nút mã trong trình chỉnh sửa. –

Trả lời

8

Không thể tuyên bố là chuyên gia về luồng trăn hay gtk3 nhưng sau khi chơi một chút với ví dụ của bạn, tôi đã tìm thấy thứ gì đó dường như hoạt động theo cách bạn muốn. Thay vì sub classing Thread tôi sử dụng threading.start (target = loop_sleep), và đặt nó bên trong Gui.

Glib.threads_init() cũng có vẻ cần thiết.

#!/usr/bin/env python3 
from gi.repository import Gtk,Gdk, GLib 
import threading 
import time 

class Gui(Gtk.Window): 
    def __init__(self): 
     self.Window = Gtk.Window() 
     self.Window.set_border_width(8) 
     self.Window.set_title("Некий GUI") 
     self.Window.connect('destroy', lambda x: self.stop()) 

     self.outBut = Gtk.Button.new_from_stock(Gtk.STOCK_OK) 
     self.outBut.set_size_request(150, 35) 
     self.Window.connect('destroy', lambda x: self.stop()) 
     self.Window.add(self.outBut) 

     self.Window.show_all() 
     threading.Thread(target=loop_sleep).start() 

    def stop(self): 
     Gtk.main_quit() 

    def passfun(self): 
     pass 

def loop_sleep(): 
     i = 1 
     while True: 
      print(i) 
      i = i + 1 
      #time.sleep(1) 



app = Gui() 
GLib.threads_init() 
Gdk.threads_init() 
Gdk.threads_enter() 
Gtk.main() 
Gdk.threads_leave() 
Các vấn đề liên quan