0

これは、ローカルシステムで使用したものと同じスクリプトであり、正確に機能します。同じスクリプトが、同じシステムの同じセットアップである別の場所で使用されています。しかし、機能していません。

私はこれについて自分自身に何も悪いことを見つけることができません。Pythonのバグかどうかはわかりますか?

それが行うことは24時間年中無休で実行され、午前9時前と午後3時以降の単純なGUIを示します(PCには午前または午後ではなく24時間モードがあります)。しかし、それは長期的には行われていません。(私のローカルシステムでは、正確に実行しています)。これを解決するにはどうすればよいですか?

import sys
import datetime
import time
from PyQt4 import QtCore, QtGui

class Main(QtGui.QMainWindow):
  def __init__(self, parent=None):
    super(Main, self).__init__(parent) 
    flags  = QtCore.Qt.Window
    flags |= QtCore.Qt.FramelessWindowHint
    flags |= QtCore.Qt.WindowStaysOnTopHint
    self.setWindowFlags(flags)     
    self.b = QtGui.QPushButton("9/15 open", self, clicked=self.close)
    self.c = QtGui.QLabel("", self)

  def myRun(self):
    while True:
      time.sleep(2)
      print "[Debug]: " + self.showNowHour() + " " + self.showNowMinute()      
      hour = int(self.showNowHour())
      minute = int(self.showNowMinute())
      if (hour>8 and hour<15):
        print "is open"
        self.hide()
      else:
        print "is close"
        self.show()

  def showNowHour(self):
    now = datetime.datetime.now()
    now = now.strftime("%H")    
    return now

  def showNowMinute(self):
    now = datetime.datetime.now()
    return now.strftime("%M")

if __name__ == "__main__":
  app=QtGui.QApplication(sys.argv)
  myapp=Main()
  myapp.setStyleSheet("background-color: rgb(85, 0, 0);")
  thread = QtCore.QThread()
  thread.run = lambda myapp=myapp: myapp.myRun()
  thread.start()    
  sys.exit(app.exec_())

フォローアップ

  1 import sys
  2 import datetime
  3 import time
  4 from PyQt4 import QtCore, QtGui
  5 
  6 class Main(QtGui.QMainWindow):
  7   def __init__(self, parent=None):
  8     super(Main, self).__init__(parent)
  9     self.b = QtGui.QPushButton("exit", self, clicked=self.close)
 10 
 11   def showNowHour(self):
 12     return datetime.datetime.now().strftime("%H")
 13 
 14   def showNowMinute(self):
 15     return datetime.datetime.now().strftime("%M")
 16 
 17   def myRun(self):
 18     while True:
 19       time.sleep(2)
 20       hour = int(self.showNowHour())
 21       minute = int(self.showNowMinute())
 22       print "[Debug]: " + str(hour) + " " + str(minute)
 23       if (hour>8 and hour<15):
 24         print "is open"
 25       else:
 26         print "is close"
 27 
 28 if __name__ == "__main__":
 29   app=QtGui.QApplication(sys.argv)
 30   myapp=Main()
 31   myapp.show()
 32   thread = QtCore.QThread()
 33   thread.run = lambda myapp=myapp: myapp.myRun()
 34   thread.start()    
 35   app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()"))
 36   sys.exit(app.exec_())
 37   while thread.isAlive():
 38     app.processEvents()
 39 
4

2 に答える 2

0

どういうわけか、strftime()の呼び出しは失敗しています。私はそれについて何も悪いことはわかりませんが、それが唯一の論理的な結論です。しかし、datetimeオブジェクトからhourに直接アクセスできるのに、なぜstrftimeを使用しているのかわかりません。

showNowHourの呼び出しを「datetime.datetime.now()。hour」に置き換えてみてください。24時間の範囲の整数を返します

http://docs.python.org/library/datetime.html#datetime-objectsを参照してください

于 2012-06-03T09:40:27.237 に答える
0

別のスレッドからGUIメソッドを呼び出しているため、これは失敗する可能性があります。常にメインスレッド(別名「GUIスレッド」)内でGUI呼び出しを実行する必要があります。そうしないと、問題が発生しやすくなります。

すべてのループで2秒間スリープするスレッドの代わりに、2秒ごとに起動するスレッドに置き換えますQTimer。あなたのメインラインにこのようなものを入れてください:

timer = QTimer()
timer.timeout.connect(myapp.myPeriodicRun)  # connect the "timeout" signal
timer.start(2000)  # call every 2 seconds

クラスで、メソッドを次のようMainに置き換えます。myRun

def myPeriodicRun(self):
  print "[Debug]: " + self.showNowHour() + " " + self.showNowMinute()      
  hour = int(self.showNowHour())
  minute = int(self.showNowMinute())
  if (hour>8 and hour<15):
    print "is open"
    self.hide()
  else:
    print "is close"
    self.show()

スレッドが不要なのはいいですね!

于 2012-06-03T10:31:09.293 に答える