我是 tkinter 的新手,我撰寫了一個實時 cps 計數器來顯示您當前的 cps,因此 cps 值不斷變化。我想做的就是在 tkinter GUI或其他 GUI中顯示此輸出,而不是在我的 pycharm 輸出框中。
這是我得到的輸出,注意cps值是不斷變化的
10.4 cps
在我的代碼中有列印 cps 的代碼行:
print(raw_raw/sec, 'cps', end="")
有什么辦法可以在 tkinter GUI 中使這一行“列印”?
還有這一行:
print("\r", end="")
這使得 cps 計數保持在同一行,通過替換前一行不列印無限的 cps 值串列
完整代碼:
from pynput.mouse import Listener
import time
raw_clicks = 0
sec = 0.6
def on_click(x, y, button, pressed):
global start
listener.stop()
start = time.time()
print('')
with Listener(on_click=on_click) as listener:
listener.join()
while True:
def on_click(x, y, button, pressed):
global raw_clicks
global sec
global start
raw_clicks = raw_clicks 1
if time.time() - start > sec:
listener.stop()
raw_raw = (raw_clicks / 2)
raw_raw = round(raw_raw/sec, 1)
print("\r", end="")
print(raw_raw, 'cps', end="")
raw_clicks = 0
start = time.time()
with Listener(on_click=on_click) as listener:
listener.join()
謝謝你的幫助
uj5u.com熱心網友回復:
我做了一個例子,在 cmdline、tkinter 和 pyqt5 中顯示你的 cpi。
我簡化了您的 cpi 計數器并在課堂上制作。很抱歉完全更改您的代碼,但這樣更適合使用多個輸出介面。原則上,您可以使用您的代碼,但不能阻塞。
讓我們從 file 開始click_counter.py,它將保存ClickCounter類,這是我們的后端,計算用戶定義的點擊次數interval(默認為 1 秒)。
from threading import Thread, Event
from typing import Callable
from pynput.mouse import Listener
class ClickCounter(Thread):
"""Click counter, counting clicks / interval"""
click_count = 0
stopped = Event()
def __init__(self, callback: Callable, interval: float = 1.0) -> None:
super().__init__()
self.interval = interval
self.callback = callback
self.listener = Listener(on_click=self.click_counter)
def run(self) -> None:
"""Start mouse click listener and timer"""
self.listener.start()
while not self.stopped.wait(self.interval):
# Call callback with click counter value, after interval expires
self.callback(self.click_count)
# Reset counter
self.click_count = 0
def click_counter(self, x: float, y: float, button: int, pressed: bool) -> None:
"""Count clicks"""
if pressed:
# Count when mouse button is pressed
self.click_count = 1
def cancel(self) -> None:
"""Cancel counter timer"""
# Stop timer
self.stopped.set()
# Stop listener
self.listener.stop()
然后我們可以定義不同的輸出介面。
讓我們從命令列開始cps_cmdline.py,它顯示cps在命令列中:
import signal
from time import sleep
from click_counter import ClickCounter
def print_counter(count):
print("\r", end="")
print(count, 'cps', end="")
click_counter = ClickCounter(print_counter)
click_counter.start()
stopped = False
def exit_app(*args):
"""Close counter and app"""
global stopped, click_counter
click_counter.cancel()
stopped = True
# Register kill signals
signal.signal(signal.SIGINT, exit_app)
signal.signal(signal.SIGTERM, exit_app)
while not stopped:
# Just run until stopped
sleep(0.1)
要在 tkinter 中顯示 cps,請使用檔案中的代碼cps_tkinter.py:
import tkinter as tk
from cps.click_counter import ClickCounter
class Window(tk.Frame):
def __init__(self, master=None):
"""Create label and StringVar holding its text"""
super().__init__(master)
self.master = master
self.pack(fill=tk.BOTH, expand=1)
self.cps_text = tk.StringVar(value="0 cps")
self.cps_label = tk.Label(self, textvariable=self.cps_text)
self.cps_label.place(relx=0.5, rely=0.5, anchor='center')
def print_counter(self, count):
"""Thread safe variable set"""
self.after(0, self.cps_text.set, f"{count} cps")
if __name__ == "__main__":
root = tk.Tk()
app = Window(root)
root.wm_title("CPS counter")
root.geometry("100x100")
# Create and start counter
click_counter = ClickCounter(app.print_counter)
click_counter.start()
# Start tkinter app
root.mainloop()
# tkinter app is over, cancel click_counter
click_counter.cancel()
最后但并非最不重要的cps_qt5.py:
import sys
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout
from cps.click_counter import ClickCounter
class Window(QWidget):
sig_print_counter = pyqtSignal(int)
def __init__(self, parent=None):
"""Create label and StringVar holding its text"""
super().__init__(parent)
self.cps_label = QLabel()
self.cps_label.setText("0 cps")
self.resize(100, 100)
layout = QHBoxLayout()
layout.setAlignment(Qt.AlignHCenter)
layout.addWidget(self.cps_label)
self.setLayout(layout)
self.sig_print_counter.connect(self.print_counter)
@pyqtSlot(int)
def print_counter(self, count):
"""Thread safe label text set"""
self.cps_label.setText(f"{count} cps")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
# Create and start counter
click_counter = ClickCounter(window.sig_print_counter.emit)
click_counter.start()
app.exec()
# Qt app is over, cancel click_counter
click_counter.cancel()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/449661.html
上一篇:我如何使args型別的變數將引號或字串作為引數等等?
下一篇:MFC從哪里獲取自動化ID?
