[Yardım] Wxpython GUI
-
beyler nerde yanlış yapıyorum bir bakar mısınız?
windows'ta çalışıyor takır takır: http://inciswf.com/twktmoxt.swf
ubuntu'da (python 2.7.3 + wxPython kurulu): tıkladığımda 1 yazıyor ve donuyor GUI
-
# -*- coding: utf-8 -*- import threading import wx import time class MyFrame1 ( wx.Frame ): def __init__( self, parent ): self.p_stop = 0 self.p_checked = 0 wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) bSizer3 = wx.BoxSizer( wx.VERTICAL ) self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"Yazilar", wx.DefaultPosition, wx.DefaultSize, 0 ) self.m_staticText1.Wrap( -1 ) bSizer3.Add( self.m_staticText1, 0, wx.ALL, 5 ) self.m_button1 = wx.Button( self, wx.ID_ANY, u"Tikla", wx.DefaultPosition, wx.DefaultSize, 0 ) bSizer3.Add( self.m_button1, 0, wx.ALL, 5 ) self.SetSizer( bSizer3 ) self.Layout() self.m_statusBar1 = self.CreateStatusBar( 1, wx.ST_SIZEGRIP, wx.ID_ANY ) self.Centre( wx.BOTH ) self.m_button1.Bind( wx.EVT_BUTTON, self.button1_tikla ) def __del__( self ): pass def button1_tikla( self, event ): try: self.p except: self.p = threading.Thread(target=self.th1) self.p_stop = 0 self.p_checked = 0 self.p.start() else: print u"Thread zaten çalışıyor" def th1(self): try: for x in range(1,100000): if self.p_stop == 1: self.p_checked = 1 break self.m_staticText1.Label = str(x) time.sleep(0.01) self.p_checked = 1 except: print u"Thread çalıştırma hatası" else: print u"sorun yok" app = wx.App(False) frame = MyFrame1(None) frame.Show(True) app.MainLoop()
-
up
-
up
-
hocam bu konuda bilgim olsa ilk paylaşmak isteyeceğim insan sensin ama yok malesef şimdilik.
En azından uplayalım bilen çıkar elbet.
-
uplıyım kanka :)
-
python dan anlamam hocam ama hatayı deneme yanılma yöntemi ile bulabilirsin.
anladığım kadarıyla for a kadar geliyor. for un içindeki kodları commente al. sonra x değerini console/output/trace artık ne varsa oraya yazdır. bak bakalım for döngüsü sıkıntısız çalışıyor mu?
eğer problem var ise for un değerini değiştir sayıyı küçültüp dene, olmadı for u kaldır ve kodunu öyle yaz.. o da olmadı üst taraftaki kodlara bak.
eğer for sorunsuz çalıştıysa for un içindeki kodları satır satır yaz. mesela 4 satır var for un içinde, ilk önce 1. satırın commentini kaldır ve çalıştır, kilitlenme olmuyorsa 2. satırı kaldır ve dene.. bu şekilde hangi satır kilitlenmeye sebep oluyorsa anlarsın.
eğer bir exception türetseydi except bloğunda yakalanırdı.
normalde gui kilitlenmesinin sebebi ise ui ye bağlı olan threadde bir işlem yaptığında ui kilitlenir. ama işlem bitince yine çalışır. bunun için farklı bir thread yaratılıp, işlemler o thread üzerinden gerçekleşir. sen gui nin kilitlendiğini söyledin. 100 000 sayma işleminin bitmesini bekliyor olabilir. o yüzden yukarda dediğim gibi sayıyı küçült. mesela 10 yap. eğer sayım 10 da bitip gui kilitlenmesi bitiyorsa thread ayrılmamış demektir. farklı bir threadde bu işlemi yapman gerekiyor demektir. for döngüsü 100 bine kadar sayarken sen kilitlendi diyorsun ve kapatmaya çalışıyorsun, döngünün bitmesini beklemiyorsun da olabilir..
neden windowsta böyle linux da böyle dersen bilmiyorum, öncelikle sorunu tespit edelim. ondan sonra açıklama yapmaya çalışırız
-
unbalanced bunu yazdı
python dan anlamam hocam ama hatayı deneme yanılma yöntemi ile bulabilirsin.
anladığım kadarıyla for a kadar geliyor. for un içindeki kodları commente al. sonra x değerini console/output/trace artık ne varsa oraya yazdır. bak bakalım for döngüsü sıkıntısız çalışıyor mu?
eğer problem var ise for un değerini değiştir sayıyı küçültüp dene, olmadı for u kaldır ve kodunu öyle yaz.. o da olmadı üst taraftaki kodlara bak.
eğer for sorunsuz çalıştıysa for un içindeki kodları satır satır yaz. mesela 4 satır var for un içinde, ilk önce 1. satırın commentini kaldır ve çalıştır, kilitlenme olmuyorsa 2. satırı kaldır ve dene.. bu şekilde hangi satır kilitlenmeye sebep oluyorsa anlarsın.
eğer bir exception türetseydi except bloğunda yakalanırdı.
normalde gui kilitlenmesinin sebebi ise ui ye bağlı olan threadde bir işlem yaptığında ui kilitlenir. ama işlem bitince yine çalışır. bunun için farklı bir thread yaratılıp, işlemler o thread üzerinden gerçekleşir. sen gui nin kilitlendiğini söyledin. 100 000 sayma işleminin bitmesini bekliyor olabilir. o yüzden yukarda dediğim gibi sayıyı küçült. mesela 10 yap. eğer sayım 10 da bitip gui kilitlenmesi bitiyorsa thread ayrılmamış demektir. farklı bir threadde bu işlemi yapman gerekiyor demektir. for döngüsü 100 bine kadar sayarken sen kilitlendi diyorsun ve kapatmaya çalışıyorsun, döngünün bitmesini beklemiyorsun da olabilir..
neden windowsta böyle linux da böyle dersen bilmiyorum, öncelikle sorunu tespit edelim. ondan sonra açıklama yapmaya çalışırız
hocam dediklerini denedim, sayının büyüklüğüyle ilgisi olmadığını gördüm.
Thread sorunsuz çalıştı ve bitti mesajını terminal ekranında görmeme rağmen GUI'deki label hep = "1" :)
evet python bilen arkadaşlardan yardım bekliyorum.
-
tamam hocam senin dediklerinden sonra sorunu buldum sanırım. invalidate yapmak gerekiyor kontrolü.. yani yenilenmesi gerekiyor ve araştırdım baktım aynen öyleymiş :))
from Tkinter import * import win32com.client Scope = win32com.client.dynamic.Dispatch('ScopeSim.Telescope') root=Tk() label = Label(root, text=Scope.SiderealTime) label.grid(row=0, sticky=W) def update_label(): label.config(text=Scope.SiderealTime) label.after(1000, update_label) label.after(1000, update_label)
mesela bu kod her 1000 ms(1 sn) de bir yenileniyor.. bunu kullanabilirsin döngünde
-
buralardaki değişik kod biçimlerini inceleyebilirsin
http://stackoverflow.com/questions/2603169/python-tkinter-update-label-from-variable
http://stackoverflow.com/questions/1918005/making-python-tkinter-label-widget-update/1918054#1918054
-
uğraştığın için teşekkür ederim hocam ama ben WxPython GUI library kullanıyorum muhtemelen yazdığın onda olmaz ama bi deniyim
Tkinter dediği python'un kendi library'si ve pek fazla bileşen yok içinde