recherche

Maison  >  Questions et réponses  >  le corps du texte

Le problème du multi-threading python-pyqt n'est vraiment pas très clair. . Résoudre. .

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

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

<code>from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")

        MainWindow.resize(382, 500)

        MainWindow.setMinimumSize(QtCore.QSize(382, 500))

        MainWindow.setMaximumSize(QtCore.QSize(382, 500))

        self.centralwidget = QtWidgets.QWidget(MainWindow)

        self.centralwidget.setObjectName("centralwidget")

        self.label = QtWidgets.QLabel(self.centralwidget)

        self.label.setGeometry(QtCore.QRect(30, 40, 18, 12))

        self.label.setObjectName("label")

        self.label_2 = QtWidgets.QLabel(self.centralwidget)

        self.label_2.setGeometry(QtCore.QRect(200, 30, 51, 31))

        self.label_2.setObjectName("label_2")

        self.label_3 = QtWidgets.QLabel(self.centralwidget)

        self.label_3.setGeometry(QtCore.QRect(20, 80, 30, 12))

        self.label_3.setObjectName("label_3")

        self.label_4 = QtWidgets.QLabel(self.centralwidget)

        self.label_4.setGeometry(QtCore.QRect(200, 70, 51, 31))

        self.label_4.setObjectName("label_4")

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)

        self.pushButton.setGeometry(QtCore.QRect(290, 430, 71, 41))

        self.pushButton.setObjectName("pushButton")

        self.rz = QtWidgets.QTextEdit(self.centralwidget)

        self.rz.setGeometry(QtCore.QRect(10, 290, 200, 191))

        self.rz.setObjectName("rz")

        self.label_5 = QtWidgets.QLabel(self.centralwidget)

        self.label_5.setGeometry(QtCore.QRect(110, 120, 81, 31))

        self.label_5.setObjectName("label_5")

        self.label_6 = QtWidgets.QLabel(self.centralwidget)

        self.label_6.setGeometry(QtCore.QRect(110, 190, 81, 31))

        self.label_6.setObjectName("label_6")

        self.label_7 = QtWidgets.QLabel(self.centralwidget)

        self.label_7.setGeometry(QtCore.QRect(110, 240, 81, 31))

        self.label_7.setObjectName("label_7")

        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)

        self.groupBox.setGeometry(QtCore.QRect(10, 110, 91, 161))

        self.groupBox.setObjectName("groupBox")

        self.xz = QtWidgets.QRadioButton(self.groupBox)

        self.xz.setGeometry(QtCore.QRect(10, 120, 89, 16))

        self.xz.setObjectName("xz")

        self.sc = QtWidgets.QRadioButton(self.groupBox)

        self.sc.setGeometry(QtCore.QRect(10, 70, 89, 16))

        self.sc.setObjectName("sc")

        self.zx = QtWidgets.QRadioButton(self.groupBox)

        self.zx.setGeometry(QtCore.QRect(10, 20, 89, 16))

        self.zx.setObjectName("zx")

        self.IP = QtWidgets.QLineEdit(self.centralwidget)

        self.IP.setGeometry(QtCore.QRect(60, 29, 131, 31))

        self.IP.setObjectName("IP")

        self.dk = QtWidgets.QLineEdit(self.centralwidget)

        self.dk.setGeometry(QtCore.QRect(230, 30, 61, 31))

        self.dk.setObjectName("dk")

        self.zh = QtWidgets.QLineEdit(self.centralwidget)

        self.zh.setGeometry(QtCore.QRect(60, 70, 131, 31))

        self.zh.setObjectName("zh")

        self.mm = QtWidgets.QLineEdit(self.centralwidget)

        self.mm.setGeometry(QtCore.QRect(230, 70, 131, 31))

        self.mm.setObjectName("mm")

        self.mm.setEchoMode(QtWidgets.QLineEdit.Password)

        self.ml = QtWidgets.QTextEdit(self.centralwidget)

        self.ml.setGeometry(QtCore.QRect(180, 120, 181, 61))

        self.ml.setObjectName("ml")

        self.bd = QtWidgets.QLineEdit(self.centralwidget)

        self.bd.setGeometry(QtCore.QRect(180, 190, 181, 31))

        self.bd.setObjectName("bd")

        self.yc = QtWidgets.QLineEdit(self.centralwidget)

        self.yc.setGeometry(QtCore.QRect(180, 240, 181, 31))

        self.label_8 = QtWidgets.QLabel(self.centralwidget)

        self.label_8.setGeometry(QtCore.QRect(280, 380, 81, 21))

        self.label_8.setStyleSheet("color: rgb(255, 0, 0);")

        self.label_8.setObjectName("label_8")

        self.yc.setObjectName("yc")

        self.zx.setChecked(True)

        self.dk.setText("22")

        self.zh.setText("root")

        self.bd.setEnabled(False)

        self.yc.setEnabled(False)

 

 

        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)

        self.zx.clicked.connect(self.zxml)

        self.sc.clicked.connect(self.sx)

        self.xz.clicked.connect(self.sx)

        self.pushButton.clicked.connect(self.linux)

         

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def zxml(self):

        self.bd.setEnabled(False)

        self.yc.setEnabled(False)

        self.ml.setEnabled(True)

    def sx(self):

        self.bd.setEnabled(True)

        self.yc.setEnabled(True)

        self.ml.setEnabled(False)

    def linux(self):

        import os

        import sys

        aa=os.path.split(os.path.realpath(sys.argv[0]))

        self.rz.setText("")

        dk=int(self.dk.text())

        zh=self.zh.text()

        mm=self.mm.text()

        ml=self.ml.toPlainText()

        if os.path.exists(aa[0]+"/log.txt"):

            os.remove(aa[0]+"/log.txt")

        if self.mm.text()=="" and self.IP.text()=="":

            self.label_8.setText("密码不能为空!")

        elif self.IP.text()=="":

            self.label_8.setText("IP不能为空!")

        else:

            a = self.IP.text()

            self.label_8.setText("")

            def hanshu(b):

                import paramiko 

                #paramiko.util.log_to_file("c:/paramiko.log")

                ssh = paramiko.SSHClient()

                ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

                try:

                    ssh.connect(b, dk, zh, mm,timeout=3)

                    QApplication.processEvents()

                    if self.zx.isChecked()==True:

                        stdin, stdout, stderr = ssh.exec_command(ml)#执行命令行

                        self.rz.setText(self.rz.toPlainText()+b+"执行成功"+"\n")###多线程时这条执行不了,报错。。

                        print("a")

                        with open(aa[0]+"/log.txt", 'a') as f:

                            f.write(stdout.read().decode('utf-8')+"\n")

                        ssh.close()

                    elif self.sc.isChecked()==True:

                        ftp = ssh.open_sftp() 

                        ftp.put(self.bd.text(),self.yc.text())#上传文件

                        self.rz.setText(self.rz.toPlainText()+b+"执行成功"+"\n")###多线程时这条执行不了,报错。。

                        with open(aa[0]+"/log.txt", 'a') as f:

                            f.write("执行成功\n")

                        ftp.close()

                        ssh.close()

                    elif self.xz.isChecked()==True:

                        ftp = ssh.open_sftp() 

                        ftp.get(self.yc.text(),self.bd.text())#下载文件

                        self.rz.setText(self.rz.toPlainText()+b+"执行成功"+"\n")###多线程时这条执行不了,报错。。

                        with open(aa[0]+"/log.txt", 'a') as f:

                            f.write("执行成功\n")

                        ftp.close()

                        ssh.close()

                except:

                    print (b+"无法连接"+"\n")

                    self.rz.setText(self.rz.toPlainText()+b+"无法连接"+"\n")###多线程时这条执行不了,报错。。

                    with open(aa[0]+"/log.txt", 'a') as f:

                        f.write(b+"无法连接"+"\n"+"\n")

                     

             

            sz=[]

            for ip in a.split(','):

                if '-' in ip:

                    s1, s2 = ip.rsplit('.', 1)

                    start, end = map(int, s2.split('-'))

                    for num in range(start, end+1):

                        r=s1+'.'+str(num)

                        sz.append(r)

                        #aa=threading.Thread(target=hanshu,args=(b,))

                        #aa.start()

                        #hanshu(b)

                else:

                    sz.append(r)

                    #hanshu(ip)

            import threading

            for b in sz:

                print(b)

                t=threading.Thread(target=hanshu,args=(b,))

                t.start()

 

    def retranslateUi(self, MainWindow):

        _translate = QtCore.QCoreApplication.translate

        MainWindow.setWindowTitle(_translate("MainWindow", "Linux管理工具"))

        self.label.setText(_translate("MainWindow", "IP:"))

        self.label_2.setText(_translate("MainWindow", "端口:"))

        self.label_3.setText(_translate("MainWindow", "账号:"))

        self.label_4.setText(_translate("MainWindow", "密码:"))

        self.pushButton.setText(_translate("MainWindow", "执行"))

        self.label_5.setText(_translate("MainWindow", "输入命令:"))

        self.label_6.setText(_translate("MainWindow", "本地路径:"))

        self.label_7.setText(_translate("MainWindow", "远程路径:"))

        self.groupBox.setTitle(_translate("MainWindow", "操作:"))

        self.xz.setText(_translate("MainWindow", "下载文件"))

        self.sc.setText(_translate("MainWindow", "上传文件"))

        self.zx.setText(_translate("MainWindow", "执行命令"))

 

 

from PyQt5.QtWidgets import QApplication , QMainWindow

import sys

if __name__ == '__main__':

    app = QApplication(sys.argv)

    mainWindow = QMainWindow()

    ui = Ui_MainWindow()

    ui.setupUi(mainWindow)

    mainWindow.show()

    sys.exit(app.exec_())

</code>

Le message d'erreur est le suivant : `QObject : Impossible de créer des enfants pour un parent qui se trouve dans un fil de discussion différent.
(Le parent est QTextDocument(0x27e4150), le fil de discussion du parent est QThread(0xc306a0), le fil de discussion actuel est QThread(0xc0eca0) `

S'il vous plaît, aidez-moi à modifier le multi-thread ou fournissez une preuve. Je veux juste qu'il affiche le journal dans la zone de texte. . .

女神的闺蜜爱上我女神的闺蜜爱上我2771 Il y a quelques jours997

répondre à tous(2)je répondrai

  • ringa_lee

    ringa_lee2017-06-12 09:27:21

    def hanshu(b) N'est-ce pas vrai ? Puis-je citer self.xxx ici ? Vous pouvez transmettre la valeur sous la forme def hanshu(xx,yy,b) puis réessayer. Lorsque vous l'utilisez, c'est hanshu(self.xx,self.yy,b).

    répondre
    0
  • 某草草

    某草草2017-06-12 09:27:21

    L'invite est très claire
    Les threads non-GUI peuvent faire fonctionner des éléments des threads GUI
    Ceci n'est pas thread-safe dans QT
    Si vous souhaitez que les threads non-GUI exploitent les threads GUI, vous devez utiliser l'emplacement de signal

    répondre
    0
  • Annulerrépondre