Форум программистов, компьютерный форум, киберфорум
Python: IDE, инструментарий
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533

Необычная проблема с pyinstaller

01.09.2020, 17:03. Показов 4416. Ответов 41

Студворк — интернет-сервис помощи студентам
Всем здравствуйте! Я тут немного, так сказать, встрял. Нагуглить не смог, поэтому спрашиваю тут, возможно кто-то сталкивался.

Итак, сделал я прогу с PyQt5 интерфейсом, с многопоточностью ну и другой всякой ерундой. Вроде всё работает. Сижу думаю, дайка я сделаю экзешник (тапками не бросайтесь, знаю идея - гов*но). Решил использовать для этих целей pyinstaller. Сделал я значиЦЦо .exe - файл, сижу довольный. Тут мой взор падает на cmd - окошко за моим красивейшим интерфейсом. Хм-м-м. Непорядок. Я открываю либу по pyinstaller, а там то всего и надо то прописать --noconsole. Прописал - программа запускает интерфейс но ничего не делает, кнопочки нажимаются, поля пишутся, а работать - не работает. А вот если не прописывать --noconsole то всё работает. Ребят, спасайте, я самостоятельно догнать не могу.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.09.2020, 17:03
Ответы с готовыми решениями:

Проблема с pyinstaller
Приветствую, я установил pyinstaller через pip написало что всё установлено, а когда пишу pyinstall main.py то выдаёт ошибку...

Проблема с установкой Pyinstaller Версия Python 3.8.3
Проблема с установкой Pyinstaller Версия Python 3.8.3 ============================================ ...

Не работает PyInstaller (При установке PyInstaller не создаётся исполняемый файл)
День добрый всем программистам! :yahoo: Нужна помощь с библиотеками Python, а конкретно с PyInstaller :help: Создал небольшую...

41
5037 / 1064 / 149
Регистрация: 29.01.2013
Сообщений: 6,214
02.09.2020, 00:50
Damenikx, я тут видел уже подобное описание проблем)
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
02.09.2020, 08:55  [ТС]
Alli_Lupin, попробую поискать, спасибо.

Добавлено через 19 минут
Поискал по форуму, решения похожей проблемы - нет

Добавлено через 4 минуты
Хм, заметил такую вещь. В консоли (когда уже скомпелировал программу) пишет следующее:

QObject::startTimer: Timers cannot be started from another thread

Может в этом проблема? Но я всё равно не понимаю, как это может быть связано.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
02.09.2020, 08:59
Damenikx, может у тебя код есть который сможет показать эту ошибку?

Добавлено через 55 секунд
Желательно еще версию Python и PyQt5 узнать, побольше информации, товарищ!
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
02.09.2020, 09:08  [ТС]
Может всё дело в том, что я использовал питоновский thread а не QThread?

Добавлено через 22 секунды
DmFat, лады, сейчас всё будет!

Добавлено через 5 минут
Итак, выкладываю сей ужас на смех людской!

Основной файл с программой:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
from PyQt5 import QtWidgets, Qt, QtGui
from Disign.first import Ui_MainWindow
import sys, threading, subprocess, time, platform, datetime, win10toast, os, logging
from win10toast import ToastNotifier
 
 
class ExamplePopup(QtWidgets.QDialog):
    def __init__(self, name, parent=None):
        super().__init__(parent)
        self.name = name
        self.label = QtWidgets.QLabel(self.name, self)
 
 
class mywindow(QtWidgets.QMainWindow):
    def __init__(self):
        self.my_threadProgram = None
        self.my_threadIP = None
        self.my_threadMSG = None
        super(mywindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.labelIP = self.ui.label
        self.lineEditIP = self.ui.lineEdit
        self.lineEditLogin = self.ui.lineEdit_2
        self.lineEditPingIp = self.ui.lineEdit_4
        self.lineEditPassword = self.ui.lineEdit_3
        self.lineEditWorkProgram = self.ui.lineEdit_5
        self.timeRefresh = self.ui.timeEdit
        self.buttonStart = self.ui.pushButton
        self.buttonStop = self.ui.pushButton_2
        self.txtOut = self.ui.listWidget
        self.msg = QtWidgets.QMessageBox()
        self.buttonStart.clicked.connect(self.start_CheckHostIp)
        self.buttonStop.clicked.connect(self.stop_CheckHostIp)
        self.toaster = ToastNotifier()
        self.comboBox = self.ui.comboBox
 
        self.tray_icon = QtWidgets.QSystemTrayIcon(self)
        self.tray_icon.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_ComputerIcon))
        self.show_action = QtWidgets.QAction("Развернуть", self)
        self.show_action.triggered.connect(self.show)
        self.tray_menu = QtWidgets.QMenu()
        self.tray_menu.addAction(self.show_action)
        self.tray_icon.setContextMenu(self.tray_menu)
        self.tray_icon.show()
 
        self.comboBox.addItem("notepad.exe")
 
    def hideEvent(self, a0: QtGui.QHideEvent) -> None:
        self.hide()
 
    def CheckHostIp(self, doneIP):
        self.takeTime = int(self.timeRefresh.text())
        self.is_run_ip = True
        self.ip = self.lineEditIP.text()
        self.login = self.lineEditLogin.text()
        self.password = self.lineEditPassword.text()
        if self.lineEditIP.text() == "":
            self.txtOut.addItem('Ошибка: ->>>>> Заполните поле с IP-Адресом')
        if self.lineEditLogin.text() == "":
            self.txtOut.addItem('Ошибка: ->>>>> Заполните поле Логина')
        if self.lineEditPassword.text() == "":
            self.txtOut.addItem('Ошибка: ->>>>> Заполните поле пароля', )
        else:
            while self.is_run_ip:
                self.buttonStart.setDisabled(True)
                if subprocess.call(['ping', self.ip], stdout=subprocess.DEVNULL):
                    self.lineEditPingIp.setStyleSheet('background: red')
                    self.lineEditWorkProgram.setStyleSheet('background: red')
                    self.txtOut.addItem(f"{time.ctime()} Конечная машина не пингуется")
                    self.txtOut.scrollToBottom()
                    logging.basicConfig(format="%(asctime)s - %(message)s", filename='Logs.log', level=logging.INFO)
                    logging.info("Конечная машина не пингуется")
                    self.toaster.show_toast("Внимение!", 'Отсутствует пинг программы!', duration=2,
                                            icon_path='ico/error.ico')
                else:
                    self.lineEditPingIp.setStyleSheet('background: green')
                    self.txtOut.addItem(f"{time.ctime()} Пинг проходит, машина в сети!")
                    self.txtOut.scrollToBottom()
                    self.CheckActivityProgram(self)
                    logging.basicConfig(format="%(asctime)s - %(message)s", filename='Logs.log', level=logging.INFO)
                    logging.info("Пинг проходит, машина в сети!")
                time.sleep(self.takeTime)
 
    def CheckActivityProgram(self, doneProgram):
        self.is_run_program = True
        try:
            result_process = [i for i in subprocess.check_output(
                f'tasklist /s {self.ip} /u {self.login} /p {self.password} /fi "IMAGENAME eq {str(self.comboBox.currentText())}"',
                encoding='cp866').splitlines()]
            del result_process[0]
            list_of_val = result_process[2].rsplit(" ", maxsplit=2)[-2]
            list_of_val = int(''.join(list_of_val.split()))
            if str(self.comboBox.currentText() == "notepad.exe"):
                self.memory_usage = 30
            if list_of_val < self.memory_usage:
                self.txtOut.addItem(f"{time.ctime()} Программа не запущена, либо повисла!")
                self.txtOut.scrollToBottom()
                self.lineEditWorkProgram.setStyleSheet('background: red')
                logging.basicConfig(format="%(asctime)s - %(message)s", filename='Logs.log', level=logging.INFO)
                logging.info("Программа не запущена, либо повисла!")
                self.toaster.show_toast("Внимение!", 'Проверьте работоспособность программы!', duration=2,
                                        icon_path='ico/warning.ico')
            else:
                self.txtOut.addItem(f"{time.ctime()} Программа запущенна и работает!")
                self.txtOut.scrollToBottom()
                self.lineEditWorkProgram.setStyleSheet('background: green')
                logging.basicConfig(format="%(asctime)s - %(message)s", filename='Logs.log', level=logging.INFO)
                logging.info("Программа запущенна и работает!")
 
        except:
            self.lineEditWorkProgram.setStyleSheet('background: red')
            self.txtOut.scrollToBottom()
            self.txtOut.addItem(f"{time.ctime()} Не правильный логин/пароль либо программа не запущена!")
            logging.basicConfig(format="%(asctime)s - %(message)s", filename='Logs.log', level=logging.INFO)
            logging.info("Не правильный логин/пароль либо программа не запущена!")
            self.toaster.show_toast("Внимение!", 'Проверьте работоспособность программы!', duration=2,
                                    icon_path='ico/warning.ico')
 
    def start_CheckHostIp(self):
        doneIP = threading.Event()
        self.my_threadIP = threading.Thread(target=self.CheckHostIp, args=[doneIP], daemon=True).start()
        logging.basicConfig(format="%(asctime)s - %(message)s", filename='Logs.log', level=logging.INFO)
        logging.info(f"Запуск каждые {self.takeTime} секунд.")
 
    def stop_CheckHostIp(self):
        self.is_run_ip = False
        self.lineEditPingIp.setStyleSheet('background: red')
        self.lineEditWorkProgram.setStyleSheet('background: red')
        self.buttonStart.setDisabled(False)
        self.txtOut.addItem(f"Отключено пользователем: {time.ctime()}")
        logging.basicConfig(format="%(asctime)s - %(message)s", filename='Logs.log', level=logging.INFO)
        logging.info("Отключено пользователем")
 
if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    application = mywindow()
    application.show()
 
    sys.exit(app.exec_())


Тут дизайн PyQT5:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file 'first.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
 
 
from PyQt5 import QtCore, QtGui, QtWidgets
 
 
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setEnabled(True)
        MainWindow.resize(696, 515)
        MainWindow.setMinimumSize(QtCore.QSize(696, 515))
        MainWindow.setMaximumSize(QtCore.QSize(696, 515))
        MainWindow.setMouseTracking(False)
        MainWindow.setTabletTracking(False)
        MainWindow.setWindowTitle("MainWindow")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 210, 171, 51))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(10, 30, 171, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(190, 30, 501, 442))
        self.listWidget.setObjectName("listWidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 47, 13))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(10, 60, 47, 13))
        self.label_2.setObjectName("label_2")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(10, 80, 171, 20))
        self.lineEdit_2.setAcceptDrops(True)
        self.lineEdit_2.setAutoFillBackground(False)
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Normal)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(10, 110, 47, 13))
        self.label_3.setObjectName("label_3")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setGeometry(QtCore.QRect(10, 130, 171, 20))
        self.lineEdit_3.setFrame(True)
        self.lineEdit_3.setEchoMode(QtWidgets.QLineEdit.Password)
        self.lineEdit_3.setDragEnabled(False)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(10, 180, 171, 22))
        self.comboBox.setObjectName("comboBox")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(10, 270, 171, 51))
        self.pushButton_2.setObjectName("pushButton_2")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(10, 160, 151, 16))
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(390, 10, 81, 16))
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(70, 330, 61, 16))
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(60, 380, 81, 16))
        self.label_7.setObjectName("label_7")
        self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_4.setEnabled(False)
        self.lineEdit_4.setGeometry(QtCore.QRect(10, 350, 171, 20))
        self.lineEdit_4.setDragEnabled(False)
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_5.setEnabled(False)
        self.lineEdit_5.setGeometry(QtCore.QRect(10, 400, 171, 20))
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.timeEdit = QtWidgets.QTimeEdit(self.centralwidget)
        self.timeEdit.setGeometry(QtCore.QRect(10, 450, 171, 22))
        self.timeEdit.setCurrentSection(QtWidgets.QDateTimeEdit.SecondSection)
        self.timeEdit.setObjectName("timeEdit")
        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(40, 430, 111, 16))
        self.label_8.setObjectName("label_8")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 696, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
 
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
 
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        self.pushButton.setText(_translate("MainWindow", "Start"))
        self.label.setText(_translate("MainWindow", "IP-Adress"))
        self.label_2.setText(_translate("MainWindow", "Login"))
        self.label_3.setText(_translate("MainWindow", "Passwrod"))
        self.pushButton_2.setText(_translate("MainWindow", "Stop"))
        self.label_4.setText(_translate("MainWindow", "Choose the program"))
        self.label_5.setText(_translate("MainWindow", "Process window"))
        self.label_6.setText(_translate("MainWindow", "Ping Active"))
        self.label_7.setText(_translate("MainWindow", "Program Active"))
        self.timeEdit.setDisplayFormat(_translate("MainWindow", "ss"))
        self.label_8.setText(_translate("MainWindow", "Таймер запроса (сек.)"))


Добавлено через 1 минуту
Версия python 3.7
Версия PyQt 5.15.5

Добавлено через 40 секунд
Windows 10 x64
Машина: пЫжЫк
Жену зовут: Марина
Домашний телефон: 2020327

Добавлено через 1 минуту
Бабки под унитазом.
Ключи под ковриком.
0
5037 / 1064 / 149
Регистрация: 29.01.2013
Сообщений: 6,214
02.09.2020, 09:32
Цитата Сообщение от Damenikx Посмотреть сообщение
QObject::startTimer: Timers cannot be started from another thread
да, это может быть причиной
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
02.09.2020, 12:35  [ТС]
Цитата Сообщение от Alli_Lupin Посмотреть сообщение
да, это может быть причиной
Хм, странно всё это, наверное придётся всё таки сделать поток через QThread

Добавлено через 2 часа 59 минут
Проблема в том, что нигде не использую этот QObject::startTimer

Добавлено через 19 секунд
Какая-то билеберда...
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
02.09.2020, 13:06
GUI делал через дизайнер? Нда..
У тебя там автосгенерированный код с QCoreApplication, а в доках написано:
The QCoreApplication class provides an event loop for Qt applications without UI.
То есть эта штука судя по всему только в консоли работает.

Добавлено через 4 минуты
P.S. Ты в дизайнере тип приложения вообще какой выбирал? Консольный что ли?
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
02.09.2020, 13:11
Damenikx, хоспаде, ну зачем ты дизайнер то используешь, умный же малый.

А зачем создавать кучу переменных в дизайнере, потом создавать виджет внутри, брать из него переменные, чаво?

Давай, переписывай!
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
02.09.2020, 14:34  [ТС]
Garry Galler, DmFat, мужчины не все сразу! Сейчас поясню за базар так сказать

Во-первых и оно же во главных! Спасибо ребят, что не кинули в трудный час!

Так-с:

Цитата Сообщение от Garry Galler Посмотреть сообщение
GUI делал через дизайнер? Нда..
Да, делал через дизайнер. Мне была интересна данная тема и я решил поэксперементировать.

Цитата Сообщение от Garry Galler Посмотреть сообщение
У тебя там автосгенерированный код с QCoreApplication
Хм, надо бы присмотреться к этому вопросу, спасибо, что подсказал!

Цитата Сообщение от Garry Galler Посмотреть сообщение
Ты в дизайнере тип приложения вообще какой выбирал? Консольный что ли?
Извините за нескромный вопрос, а где там собственно выбирать тип приложения?
Цитата Сообщение от DmFat Посмотреть сообщение

хоспаде, ну зачем ты дизайнер то используешь, умный же малый.
Ну тут бы я поспорил за чашечкой пенного по-поводу своего ума )

Цитата Сообщение от DmFat Посмотреть сообщение
А зачем создавать кучу переменных в дизайнере, потом создавать виджет внутри, брать из него переменные, чаво?
Да-да, пихал всё что видел перевызывал потом и т.д., но я сразу люблю учиться плохому
Цитата Сообщение от DmFat Посмотреть сообщение

Давай, переписывай!
Видимо придётся отказаться от дизайнера

P.S. Главное чтобы дядюшка Welemir - не увидел сей ужас.

P.S.S Попробую сделать тоже самое только без дизайнера, авось получиЦЦО
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
02.09.2020, 14:37
Damenikx, когда ручками пишешь, во первых красиво, во вторых сразу понтяно где и что может не работать.
1
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
02.09.2020, 14:45  [ТС]
DmFat, так то оно так, но очень уж хотелось ковырнуть Disigner. Вот, сижу, пробую чот переписать
0
02.09.2020, 14:55

Не по теме:

Damenikx, обычно использую его, чтобы примерно накидать макет, как все будет выглядеть, не более)

0
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
02.09.2020, 14:55  [ТС]
Сделал я маленькую програмку там кнопочка, label и окно для вывода, подрубил многопоточность ииии ничего не поменялось
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
02.09.2020, 14:56
Damenikx, Код в студию.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
02.09.2020, 14:57
Цитата Сообщение от Damenikx Посмотреть сообщение
а где там собственно выбирать тип приложения?
Где-то в мастере настройки проектов.
Здесь есть скрин:
https://ravesli.com/urok-1-vve... t-creator/
0
02.09.2020, 14:59

Не по теме:

Garry Galler, скорее всего он делал через QtDesigner который идет с PyQt5

0
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
02.09.2020, 15:24  [ТС]
Если не прописывать --noconsole - то всё работает, консоль пустая. Как только прописываешь, всё, приплыли.

Добавлено через 3 минуты
Garry Galler, да-да, именно так как сказал DmFat. Я делал через QtDesigner.

Код маленькой програмки:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import sys,subprocess,time, threading, datetime
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QLabel, QVBoxLayout, QListWidget
 
 
class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
 
        self.tetleLabel = QLabel("Frist label")
        self.button = QPushButton()
        self.button.setText('qwe')
        self.txtOut = QListWidget()
 
 
        hbox = QVBoxLayout()
        hbox.addWidget(self.tetleLabel)
        hbox.addWidget(self.button)
        hbox.addWidget(self.txtOut)
        self.setLayout(hbox)
        self.button.clicked.connect(self.start_CheckHostIp)
        # self.buttonStop.clicked.connect(self.stop_CheckHostIp)
 
    def CheckHostIp(self, doneIP):
            while True:
                self.button.setDisabled(True)
                if subprocess.call(['ping', '18.12.3.36'], stdout=subprocess.DEVNULL):
                    self.txtOut.addItem(f"{datetime.datetime.now()} Конечная машина не пингуется")
                else:
                    self.txtOut.addItem(f"{datetime.datetime.now()} Пинг проходит, машина в сети!")
 
 
    def start_CheckHostIp(self):
        doneIP = threading.Event()
        self.my_threadIP = threading.Thread(target=self.CheckHostIp, args=[doneIP], daemon=True).start()
 
 
    def stop_CheckHostIp(self):
        self.is_run_ip = False
        self.buttonStart.setDisabled(False)
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    win=MainWindow()
    win.show()
    sys.exit(app.exec_())


Добавлено через 13 минут
У меня такое чувство, что это из-за того, что я использую PyQt5 и делаю многопоточность с помощью threading, а не с помощью QThreading и сигналов.

Добавлено через 6 минут
Я походу туповат, но понять так и не могу с этими сигналами, может кто подскажет? Хоть вот взять эту маленькую прогу с пингом, как там сделать вывод результата в другом потоке?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
02.09.2020, 15:25
Damenikx, нет дело не в threading, я вот грешу на subprocess и не вижу смысла его использовать.
0
 Аватар для Damenikx
955 / 341 / 114
Регистрация: 04.08.2018
Сообщений: 2,533
02.09.2020, 15:34  [ТС]
DmFat, а есть другой вариант вытянуть список процессов другого компьютера, который в сети?

Добавлено через 3 минуты
И да, без прав администратора, но с возможностью их вписать. Поэтому я и использовал tasklist
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.09.2020, 15:34
Помогаю со студенческими работами здесь

Проблема с компиляцией скрипта pyinstaller
Есть статья на хабре https://habr.com/ru/post/575100/, я попытался ее скомпилировать, но постоянно пишет что не хватает модулей. Но модули...

Проблема с создание .exe файла с использованием pyinstaller
Привет, я пытаюсь создать .exe файл, который можно передать на любой компьютер и запустить, даже на тот, в котором нет интерпретатора...

Проблема с библиотекой plyer при создании исполняемого файла с использованием pyinstaller
Добрый день. Я пытаюсь создать уведомление в Windows, используя библиотеку Plyer. Все отлично работает, когда скрипт Python запущен(.py)....

Необычная проблема с компьютером
Собрал новый компьютер. Материнская плата ASUS a320m-e Процессор AMD ryzen 3 2200g Оперативная память 8гб блок питания be quiet...

Необычная проблема с виндовс
привет всем! есть величайшая проблема. 3 дня назад на раб. стол стала выкидываться табличка ерор свхост с кодом, не убиралась ни как!...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru