RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-539485

Игорь Ищенко's questions

Martin Hope
Etozeigor
Asked: 2023-05-19 16:06:19 +0000 UTC

如何部分更改小部件的背景颜色?

  • 6

我知道如何完全改变小部件的背景颜色,但是否有可能以某种方式部分改变背景颜色?
比如上半身的颜色,如下图。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)
        self.central_widget.setAttribute(Qt.WA_StyledBackground, True)
        self.central_widget.setStyleSheet('background-color: yellow')
        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)

        self.layout_main_window.addWidget(QLabel('Строка 1'))
        self.layout_main_window.addWidget(QLabel('Строка 2'))
        self.layout_main_window.addWidget(QLabel('Строка 3'))
        self.layout_main_window.addWidget(QLabel('Строка 4'))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

现在像这样:

在此处输入图像描述


你需要这样的东西:

在此处输入图像描述


UPD: 我们谈论的是小部件,而不是整个窗口,窗口中可以有几个这样的彩色方块,我需要用两种颜色绘制每个方块:

在此处输入图像描述

python
  • 1 个回答
  • 27 Views
Martin Hope
Etozeigor
Asked: 2023-04-29 00:11:50 +0000 UTC

QTimer 没有在额外的 QThread 线程上运行

  • 6

我创建了一个单独的附加线程并尝试在其中运行,QTimer以便每秒调用一次应该在同一线程中运行的函数。

但这并没有发生,计时器只是不起作用。
有什么问题吗?

import sys
from time import sleep
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QMainWindow
from PyQt5.QtCore import QThread, QObject, QTimer

class Worker(QObject):
    def __init__(self):
        super().__init__()

    def print_2(self):
        print(2)

    def run(self):
        self.timer = QTimer()
        self.timer.timeout.connect(self.print_2)
        self.timer.start(1000)
        while True:
            print(1)
            sleep(1)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)
        self.layout_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_window)
        
        self.btn = QPushButton('Запустить поток')
        self.btn.clicked.connect(self.start_thread)
        self.layout_window.addWidget(self.btn)

    def start_thread(self):
        self.main_thread = QThread(parent=self)
        self.worker = Worker()
        self.worker.moveToThread(self.main_thread)
        self.main_thread.started.connect(self.worker.run)
        self.main_thread.start()


app = QApplication(sys.argv)
app.setStyle('Fusion')
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
python
  • 1 个回答
  • 35 Views
Martin Hope
Etozeigor
Asked: 2023-04-19 02:51:24 +0000 UTC

PyQt5主窗口报错崩溃后如何调用报错信息?

  • 6

我有一个PyQt5应用程序,比方说,它可能会在出现某些错误后崩溃。

我怎样才能在下面的示例代码中实现这样的结果,以便在主窗口下降后关闭,并调用一个带有错误文本和“确定”按钮的小对话框,关闭后应用程序退出app?

import sys

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QMainWindow, QApplication, QPushButton


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)
        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)

        self.btn_crash_programm = QPushButton('Crash')
        self.btn_crash_programm.clicked.connect(self.crash)
        self.layout_main_window.addWidget(self.btn_crash_programm)

    def crash(self):
        x = 2 / 0


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle('Fusion')
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

我打算通过将这部分代码包装在 中来实现try - except,但这不起作用,块except没有执行,主窗口关闭,应用程序继续运行并加载系统。

main_window = MainWindow()
main_window.show()
python
  • 1 个回答
  • 15 Views
Martin Hope
Игорь Ищенко
Asked: 2023-02-11 19:24:40 +0000 UTC

闪烁指示器 PyQt5 Python

  • 8

我在线程之间传递数据时遇到问题。有一个小应用,其思路如下:
有一个按钮,一个表格和两个指标——rx和rx。通过按下按钮,表格应该开始填充数据,并且指示灯应该闪烁。

我在三个线程中实现了它。
Main - 主窗口本身。
附加线程table_thread- 处理数据并将其传递给主线程以填充表。该线程还通知第三个线程rx_tx_blink_thread已发生记录并且指示灯应闪烁。

所有这些都是使用 workerfill_in_table_widget和rx_tx_blink_widget使用moveToThread.

主要问题是您需要fill_in_table_widget将需要闪烁的 worker 信息传输给 worker rx_tx_blink_widget。而这个 worker 应该将改变指标颜色的信息传递给主线程,然后等待50 мс,然后再次将改变颜色的信息传递给原来的线程。

我有这样的链实现:

       self.table_thread = QtCore.QThread()
       self.fill_in_table_widget = FillTableWorker()
       self.fill_in_table_widget.moveToThread(self.table_thread)
       self.fill_in_table_widget.new_table_row.connect(self.add_row_in_table)
       self.table_thread.started.connect(self.fill_in_table_widget.run)

       self.rx_tx_blink_thread = QtCore.QThread()
       self.rx_tx_blink_widget = RxTxWorker()
       self.rx_tx_blink_widget.moveToThread(self.rx_tx_blink_thread)
       self.rx_tx_blink_widget.rx_tx_blink_signal.connect(self.rx_tx_blink)
       self.rx_tx_blink_thread.started.connect(self.rx_tx_blink_widget.run)
       # вот тут я соединяю сигнал  tx_rx воркера fill_in_table_widget  
       # с методом blink воркера rx_tx_blink_widget. А из этого метода я передаю сигнал в 
       # метод главного окна **rx_tx_blink**, но до него сигнал судя по всему не доходит и 
       #индикаторы не меняют цвет.
       self.fill_in_table_widget.tx_rx.connect(self.rx_tx_blink_widget.blink)

请帮助我理解问题是什么以及如何实现这样的连接,以便第一个附加线程将信号传输到第二个附加线程,而后者已经将其传递给主线程,实现 50 毫秒的延迟。

下面我附上了整个代码,它应该运行:

import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from time import sleep


class MainWindow(QMainWindow):
   def __init__(self):
       super().__init__()
       # конфигурация главного окна и центрального виджета
       self.central_widget = QWidget(self)
       self.setGeometry(50, 50, 1500, 800)
       self.setWindowTitle('Чтение БКУ')
       self.setCentralWidget(self.central_widget)
       self.layout_main_window = QVBoxLayout()
       self.central_widget.setLayout(self.layout_main_window)
       # кнопка считать
       self.btn_start_reading = QPushButton("Считать")
       self.btn_start_reading.clicked.connect(self.start_read)
       self.layout_main_window.addWidget(self.btn_start_reading)
       # таблица
       self.table = QTableWidget()
       self.table.setColumnCount(9)
       self.table.setRowCount(13500)
       self.table.setHorizontalHeaderLabels(['№', 'Дата и время', 'БКУ', 'КЛ', 'АУ', 'Канал', 'Код события', 'Доп. параметр', 'Описание'])
       self.table.horizontalHeader().setStretchLastSection(True)
       self.table.horizontalHeader().setVisible(True)
       self.layout_main_window.addWidget(self.table)
       # индикаторы
       self.tx = QLabel()
       self.tx.setStyleSheet(rx_tx_yellow_stylesheet)
       self.rx = QLabel()
       self.rx.setStyleSheet(rx_tx_yellow_stylesheet)
       self.layout_main_window.addWidget(self.rx)
       self.layout_main_window.addWidget(self.tx)


   def start_read(self):
       # конфигурация доп потоков
       self.table_thread = QtCore.QThread()
       self.fill_in_table_widget = FillTableWorker()
       self.fill_in_table_widget.moveToThread(self.table_thread)
       self.fill_in_table_widget.new_table_row.connect(self.add_row_in_table)
       self.table_thread.started.connect(self.fill_in_table_widget.run)

       self.rx_tx_blink_thread = QtCore.QThread()
       self.rx_tx_blink_widget = RxTxWorker()
       self.rx_tx_blink_widget.moveToThread(self.rx_tx_blink_thread)
       self.rx_tx_blink_widget.rx_tx_blink_signal.connect(self.rx_tx_blink)
       self.rx_tx_blink_thread.started.connect(self.rx_tx_blink_widget.run)
       # соединяем два потока между собой
       self.fill_in_table_widget.tx_rx.connect(self.rx_tx_blink_widget.blink)

       self.table.clearContents() # очищаем таблицу от старых данных
       self.table_thread.start() # запускаем поток записи данных в таблицу

       # если раскомментирвоать поток снизу, программа начинает виснусть.
       # self.rx_tx_blink_thread.start() # запускаем поток мигания индикаторов

   
   @QtCore.pyqtSlot(int, object)   
   def add_row_in_table(self, i, list):
       self.table.setItem(i, 0, list[0])
       self.table.setItem(i, 1, list[1])
       self.table.setItem(i, 2, list[2])
       self.table.setItem(i, 3, list[3])
       self.table.setItem(i, 4, list[4])
       self.table.setItem(i, 5, list[5])
       self.table.setItem(i, 6, list[6])
       self.table.setItem(i, 7, list[7])
       self.table.setItem(i, 8, list[8])

   
   @QtCore.pyqtSlot(str, str)
   def rx_tx_blink(self, rx, tx):
       if rx == 'blink':
           self.rx.setStyleSheet(rx_stylesheet)
       elif rx == 'white':
           self.rx.setStyleSheet(rx_tx_yellow_stylesheet)
       if tx == 'blink':
           self.tx.setStyleSheet(tx_stylesheet)
       elif tx == 'white':
           self.tx.setStyleSheet(rx_tx_yellow_stylesheet)


rx_tx_yellow_stylesheet = """
       border-radius: 6px;
       min-height: 12px;
       max-height: 12px;
       min-width: 12px;
       max-width: 12px;
       background-color: yellow;
   """

rx_stylesheet = """
       border-radius: 6px;
       min-height: 12px;
       max-height: 12px;
       min-width: 12px;
       max-width: 12px;
       background-color: green;
   """
tx_stylesheet = """
       border-radius: 6px;
       min-height: 12px;
       max-height: 12px;
       min-width: 12px;
       max-width: 12px;
       background-color: red;
   """


class FillTableWorker(QtCore.QObject):
   new_table_row = QtCore.pyqtSignal(int, object)
   tx_rx = QtCore.pyqtSignal(str)

   def __init__(self):
       super().__init__()
       self.i = 0

   def run(self):
       i = self.i
       for i in range(12000):
           event = ['12:10:2022_11:37:56', 1, 1, 1, 1, 138, 1, 1]
           self.tx_rx.emit('Tx')
           list = [
               QTableWidgetItem(str(i+1)),
               QTableWidgetItem(str(event[0])),
               QTableWidgetItem(str(event[1])),
               QTableWidgetItem(str(event[2])),
               QTableWidgetItem(str(event[3])),
               QTableWidgetItem(str(event[4])),
               QTableWidgetItem(str(event[5])),
               QTableWidgetItem(str(event[6])),
               QTableWidgetItem(str(event[7])),
           ]
           self.new_table_row.emit(i, list)
           self.tx_rx.emit('Rx')
           i += 1
           sleep(0.05)


class RxTxWorker(QtCore.QObject):
   rx_tx_blink_signal = QtCore.pyqtSignal(str, str)

   def __init__(self):
       super().__init__()
       self.rx_color = 'white'
       self.tx_color = 'white'

   def run(self):
       while True:
           self.rx_tx_blink_signal.emit(self.rx_color, self.tx_color)


   @QtCore.pyqtSlot(str)
   def blink(self, text):
       if text == 'Rx':
           self.rx_color = 'blink'
           sleep(0.05)
           self.rx_color = 'white'
       elif text == 'Tx':
           self.tx_color = 'blink'
           sleep(0.05)
           self.tx_color = 'white'


if __name__ == '__main__':
   app = QApplication(sys.argv)
   main_window = MainWindow()
   main_window.show()
   sys.exit(app.exec_())
python
  • 1 个回答
  • 41 Views
Martin Hope
Игорь Ищенко
Asked: 2023-01-29 20:57:54 +0000 UTC

tkinker 中的 Treeview 表格弹出窗口边界

  • 5

tkinker 上有一个小界面。它有三个按钮和一个包含 50 列的表格。启动时遇到两个问题:

  1. 桌子从窗口弹出。无法解决此问题,无论是使用 methodpack()还是使用 method grid()。
  2. 不可能向表格添加滚动,它根本不会出现在这段代码中:
scrollbar = ttk.Scrollbar(window,orient=HORIZONTAL,command=table.xview)
table.configure(xscrollcommand=scrollbar.set)
scrollbar.pack()

目前可用的程序代码:

from tkinter import *
from tkinter import ttk
window = Tk()
window.config(bg='#C9C5C5')  
window.title("Добро пожаловать в приложение PythonRu")  
window.geometry('1600x900')


frame_buttons = Frame(window)
frame_buttons.pack(side=LEFT, fill=BOTH)

frame_table = Frame(window)
frame_table.pack(side=RIGHT, fill=BOTH)


start = Button(frame_buttons, text="Старт", width=13, height=2, bg='#B5B2B2', command=lambda: print_reg_values(registers_list, tree))
start.pack(side=TOP)  
stop = Button(frame_buttons, text="Стоп", width=13, height=2, bg='#B5B2B2', command=stop_func)
stop.pack(side=TOP)    
downdload_file = Button(frame_buttons, text="Загрузить в файл", width=13, height=2, bg='#B5B2B2', command=lambda: download(registers_list))  
downdload_file.pack(side=TOP)


columns_list = ['Время']
for i in range(1, 51):
    columns_list.append(i)
columns = tuple(columns_list)
table = ttk.Treeview(frame_table, columns=columns, show="headings")
table.pack(fill=BOTH, expand=True)
table.heading("Время", text="Время")
table.column('Время', stretch=NO, width=50)
for i in range(1, 51):
    table.heading(i, text=i)
    table.column(i, stretch=NO, width=35, anchor=CENTER)

scrollbar = ttk.Scrollbar(window,orient=HORIZONTAL,command=table.xview)
table.configure(xscrollcommand=scrollbar.set)
scrollbar.pack()

window.mainloop()

这是带有表格的窗口此时的样子: 窗纱

python
  • 1 个回答
  • 22 Views
Martin Hope
Игорь Ищенко
Asked: 2023-01-28 18:52:54 +0000 UTC

将数据输出到 tkinker Python GUI

  • 5

有一个程序每秒打印一次包含 30 个值的列表(模仿传感器的值)。在 tkinker 中为它编写了一个小型图形界面。当您启动该程序时,将打开一个窗口,当您单击“开始”按钮时,每秒会在文本窗口中打印一行。请告诉我如何实现停止打印的停止按钮。在这种情况下,所有打印的文本都应保留在窗口中,当您单击“开始”按钮时,打印应继续。

from tkinter import scrolledtext
from utils import register_to_list
from time import sleep
import random
from datetime import datetime
from constants import CHOICES

registers_list = []

flag = True

def print_reg_values(registers_list, txt, window):
    """Пока значение flag истинно, каждую секунду выводит на печать
    данные с датчиков и записывает эти данные в список.
    Возвращает список из списков, содержащих данные с датчиков на каждую секунду
    """
    global flag
    while flag:
        numbers = []
        for i in range(15):
            numbers.append(random.choice(CHOICES))
        values = register_to_list(numbers)
        txt.insert(1.0, f'{datetime.now().strftime("%H:%M:%S")} {values}\n')
        window.update()
        registers_list.append((datetime.now().strftime("%H:%M:%S"), values))
        sleep(1)

window = Tk()  
window.title("Добро пожаловать в приложение PythonRu")  
window.geometry('1200x800')  

start = Button(window, text="Старт", width=13, height=2, command=lambda: print_reg_values(registers_list, txt, window))  
start.grid(column=0, row=0)
stop = Button(window, text="Стоп", width=13, height=2)  
stop.grid(column=0, row=1)

txt = scrolledtext.ScrolledText(window, width=160, height=10)  
txt.grid(column=1, row=2)

window.mainloop()

带有文本打印的窗口示例

python
  • 1 个回答
  • 19 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5