2017-01-20 20 views
1

非常に小さい(1より小さい)いくつかの変数を追跡し、その値で画面上のラベルを更新したいと考えています。ただし、変数の値が1より小さい場合でも、ラベルは0(1になることもあります)にとどまります。丸められた変数値でPyQt5ラベルを更新するには?

丸め値を明示的に印刷するようにプログラムに指示するにはどうすればよいですか?問題の

import sys 
import random 
from PyQt5.QtCore import QTimer 
from PyQt5.QtWidgets import (QApplication, QLabel, QWidget) 
from PyQt5.QtGui import QPainter 


class MouseTracker(QWidget): 
    distance_from_target = 0 
    mouse_x_pos = 0 
    mouse_y_pos = 0 
    target_x_pos = 0 
    target_y_pos = 0 
    target_x_velocity = 0 
    target_y_velocity = 0 
    target_x_acceleration = 0 
    target_y_acceleration = 0 

    def __init__(self, parent=None): 
     super(MouseTracker, self).__init__(parent=parent) 
     self.initUI() 
     self.setMouseTracking(True) 
     self.timer = QTimer(self) 
     self.timer.timeout.connect(self.changePosition) 
     self.timer.start(1) 

    def changePosition(self): 
     random.seed() 
     self.target_x_acceleration = random.randint(-10, 10)/100 
     self.target_y_acceleration = random.randint(-10, 10)/100 

     self.target_x_velocity += self.target_x_acceleration 
     self.target_y_velocity += self.target_y_acceleration 

     self.target_x_pos += self.target_x_velocity 
     self.target_y_pos += self.target_y_velocity 

     self.distance_from_target = round(
      ((self.mouse_y_pos - self.target_y_pos) ** 2 + (self.mouse_x_pos - self.target_x_pos) ** 2) ** 0.5) 
     self.label.setText(
      'Mouse: (%d : %d)' % (self.mouse_x_pos, self.mouse_y_pos) + " Distance from target: " + str(self.distance_from_target) 
      + "\nTarget position: (%d : %d)" % (self.target_x_pos, self.target_y_pos) 
      + "\nTarget velocity: (%d : %d)" % (self.target_x_velocity, self.target_y_velocity) 
      + "\nTarget acceleration: (%d : %d)" % (self.target_x_acceleration, self.target_y_acceleration)) 
     self.update() 

    def initUI(self): 
     self.setGeometry(200, 200, 1000, 500) 
     self.setWindowTitle('Mouse Tracker') 
     self.label = QLabel(self) 
     self.label.resize(500, 100) 
     self.show() 

    def mouseMoveEvent(self, event): 
     self.mouse_x_pos = event.x() 
     self.mouse_y_pos = event.y() 
     self.update() 

    def mousePressEvent(self, event): 
     self.target_x_velocity = 0 
     self.target_y_velocity = 0 
     self.target_x_acceleration = 0 
     self.target_y_acceleration = 0 
     self.target_x_pos = event.x() 
     self.target_y_pos = event.y() 
     self.distance_from_target = round(
      ((self.mouse_y_pos - self.target_y_pos) ** 2 + (self.mouse_x_pos - self.target_x_pos) ** 2) ** 0.5) 
     self.update() 

    def paintEvent(self, event): 
     q = QPainter() 
     q.begin(self) 
     q.drawLine(self.mouse_x_pos, self.mouse_y_pos, self.target_x_pos, self.target_y_pos) 
     q.drawEllipse(self.target_x_pos - self.distance_from_target, self.target_y_pos - self.distance_from_target, self.distance_from_target*2, self.distance_from_target*2) 

app = QApplication(sys.argv) 
w = MouseTracker() 
sys.exit(app.exec_()) 

変数はtarget_x_velocitytarget_y_velocitytarget_x_acceleration、およびtarget_y_accelerationを、次のとおりです。

は、ここに私のコードです。

答えて

1

%d%fに変更する必要があります。最初の部分は全体の部分のみを表示し、2番目の部分は浮動した形式で表示します。 "%.Xf"に変更することもできます。Xは表示する小数点以下の桁数です。

詳細情報:

enter image description here

完全なコード:

import sys 
import random 
from PyQt5.QtCore import QTimer 
from PyQt5.QtWidgets import (QApplication, QLabel, QWidget) 
from PyQt5.QtGui import QPainter 


class MouseTracker(QWidget): 
    distance_from_target = 0 
    mouse_x_pos = 0 
    mouse_y_pos = 0 
    target_x_pos = 0 
    target_y_pos = 0 
    target_x_velocity = 0 
    target_y_velocity = 0 
    target_x_acceleration = 0 
    target_y_acceleration = 0 

    def __init__(self, parent=None): 
     super(MouseTracker, self).__init__(parent=parent) 
     self.initUI() 
     self.setMouseTracking(True) 
     self.timer = QTimer(self) 
     self.timer.timeout.connect(self.changePosition) 
     self.timer.start(1) 

    def changePosition(self): 
     random.seed() 
     self.target_x_acceleration = random.randint(-10, 10)/100 
     print(self.target_x_acceleration) 
     self.target_y_acceleration = random.randint(-10, 10)/100 

     self.target_x_velocity += self.target_x_acceleration 
     self.target_y_velocity += self.target_y_acceleration 

     self.target_x_pos += self.target_x_velocity 
     self.target_y_pos += self.target_y_velocity 

     self.distance_from_target = round(
      ((self.mouse_y_pos - self.target_y_pos) ** 2 + (self.mouse_x_pos - self.target_x_pos) ** 2) ** 0.5) 
     self.label.setText(
      'Mouse: (%d : %d)' % (self.mouse_x_pos, self.mouse_y_pos) + " Distance from target: " + str(self.distance_from_target) 
      + "\nTarget position: (%d : %d)" % (self.target_x_pos, self.target_y_pos) 
      + "\nTarget velocity: (%f : %f)" % (self.target_x_velocity, self.target_y_velocity) 
      + "\nTarget acceleration: (%f : %f)" % (self.target_x_acceleration, self.target_y_acceleration)) 
     self.update() 

    def initUI(self): 
     self.setGeometry(200, 200, 1000, 500) 
     self.setWindowTitle('Mouse Tracker') 
     self.label = QLabel(self) 
     self.label.resize(500, 100) 
     self.show() 

    def mouseMoveEvent(self, event): 
     self.mouse_x_pos = event.x() 
     self.mouse_y_pos = event.y() 
     self.update() 

    def mousePressEvent(self, event): 
     self.target_x_velocity = 0 
     self.target_y_velocity = 0 
     self.target_x_acceleration = 0 
     self.target_y_acceleration = 0 
     self.target_x_pos = event.x() 
     self.target_y_pos = event.y() 
     self.distance_from_target = round(
      ((self.mouse_y_pos - self.target_y_pos) ** 2 + (self.mouse_x_pos - self.target_x_pos) ** 2) ** 0.5) 
     self.update() 

    def paintEvent(self, event): 
     q = QPainter() 
     q.begin(self) 
     q.drawLine(self.mouse_x_pos, self.mouse_y_pos, self.target_x_pos, self.target_y_pos) 
     q.drawEllipse(self.target_x_pos - self.distance_from_target, self.target_y_pos - self.distance_from_target, self.distance_from_target*2, self.distance_from_target*2) 

app = QApplication(sys.argv) 
w = MouseTracker() 
sys.exit(app.exec_()) 

出力:のpython 3では

enter image description here

1

。 0 %文字列書式演算子は、文字列書式演算の新しいシステムに置き換えられます。 %演算子は引き続きサポートされていますが、python 3.1以降は非推奨です(What's new in Python 3を参照)。詳細はPEP3101およびFormat String Syntaxを参照してください。

'Mouse: ({} : {})'.format(self.mouse_x_pos, self.mouse_y_pos) + " Distance from target: " + str(self.distance_from_target) 

二行目:

は、私はあなたの文字列で新しいスタイルの構文の例をいくつか実装した、新しい構文の最も単純な形式での最初の行は、中括弧はformat()のパラメータのプレースホルダは、

+ "\nTarget position: ({0} : {1})".format(self.target_x_pos, self.target_y_pos) 

第三のラインパラメータのDecimalNumberとしてフォーマット:

+ "\nTarget velocity: ({:.4f} : {:.8f})".format(self.target_x_velocity, self.target_y_velocity) 
番号のパラメータを持ちます

と最後の行は、署名された(すべての場合に示される「+」記号は、「 - 」のみで示さ登録 - )さらに詳細

+0

上記リンクを参照するための

+ "\nTarget acceleration: ({0:+.6f} : {1:-.8f})".format(self.target_x_acceleration, self.target_y_acceleration)) 

'%'構文はいません推奨されていません。現時点では、リンクされたPEPで明示されているように、言語からいつ削除されるか、または削除される予定はありません(下位互換性のセクションを参照)。 – ekhumoro

+0

@ekhumoro:私は確信していません。そのテキストは2006年4月16日に公開されています。 2008年12月4日に公開された他のリンク、https://docs.python.org/release/3.0/whatsnew/3.0.html#pep-3101-a-new-approach-to-stringでは時代遅れです-formatting –

+0

PEPSは必要に応じて最新の状態に保たれます(履歴を参照)。 3.0のドキュメントは無関係です。機能が廃止されているかどうかを知りたい場合は、[警告オプション](https://docs.python.org/3.6/using/cmdline.html#cmdoption-W)を使用してテストしてください: 'python3 -Wall -c '"%s"%False''。おそらく、 '%'の書式設定を廃止する計画を廃止したというpython-devの議論があります。正当な理由がないために大量のコードが破損する可能性があるため、Python 3ではこれが削除される可能性は非常に低いようです。 – ekhumoro

関連する問題