QCombobox

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Jenke
User
Beiträge: 1
Registriert: Montag 21. Juli 2014, 17:58

Hi zusammen,
ich programmiere grade frisch in python 3.4, gehe es also mit learning by doing an.
Dabei bin ich aktuell auf ein Problem gestoßen, wobei ich einfach nicht weiter komme.
Es geht um Folgendes: Ich möchte ein Programm schreiben, welches nach dem Start eine GUI(pyQT) startet und mir dort in einer Combobox alle grade verwendeten COM-ports anzeigt. Das hat den Sinn, dass später der Benutzer nur die Auswahl zwischen den verwendeten COM-ports hat, um beispielsweise eine Verbindung zu einem Arduino aufzubauen. Da die UI in einer endlos-Schleife ja die Slots für die Widgets abfragen muss, hatte ich mir gedacht, dass ich dafür ´´einfach´´ einen neuen Thread starte und einen Zweiten, der die com-port Liste aktualisiert, starte. Soweit so gut, bis hier funktioniert es auch so wie ich mir das gedacht habe, nur schaffe ich es nicht die Liste mit den verwendeten com-ports an das QCombobox widget zu schicken.

Ich bin dankbar für jede Hilfe.

Code: Alles auswählen

import sys 
import time
import _thread
import glob
import serial

from PyQt4 import QtGui, QtCore 
from connectWinGui import Ui_connectWin as Dlg


COMPorts=[]



class Ui_connectWin(QtGui.QDialog, Dlg): 
    def __init__(self): 
        QtGui.QDialog.__init__(self) 
        self.setupUi(self)
        
        # Slots einrichten 
        self.connect(self.PBverbinden, 
                QtCore.SIGNAL("clicked()"), self.PBclickVerbinden) 
        self.connect(self.PBabbrechen, 
                QtCore.SIGNAL("clicked()"), self.PBclickAbbrechen)
#        self.connect(self.CBcom, 
#                QtCore.SIGNAL("currentIndexChanged(index)"), self.CBcom)
    
    def PBclickVerbinden(self): 
    	print("Okay")
        self.close()

    def PBclickAbbrechen(self): 
        print ("abbrechen")
        
    def CBcom(self): 
        print ("click")

#Funktionen-----------------------------------------------


def serial_ports():
    """Returns all available COM ports
    """
    if sys.platform.startswith('win'):
        result = []
        for i in range(256):
            try:
                s = serial.Serial(i)
                s.close()
                result.append('COM' + str(i + 1))
            except serial.SerialException:
                pass
        return result

    elif sys.platform.startswith('linux'):
        return glob.glob('/dev/tty*')

    elif sys.platform.startswith('darwin'):
        return glob.glob('/dev/tty.*')
        
#Threads-----------------------------------------------        
        
def qtLoopThread():
    app = QtGui.QApplication(sys.argv) 
    dialog = Ui_connectWin() 
    dialog.show() 
    app.exec_()
    sys.exit() 



def mainTread():
    global COMPorts
    while 1:
        COMPorts=serial_ports()
        print(COMPorts)
        Ui_connectWin.clear()#<----------------Hier stimmt irgend etwas nicht??
        Ui_connectWin.CBcom.addItems(COMPorts)
        time.sleep(5)
        
        
        
_thread.start_new_thread(qtLoopThread, ()) 
_thread.start_new_thread(mainTread, ()) 


while True: 
    pass
BlackJack

@Jenke: Als erstes solltest Du nicht das `_thread`-Modul verwenden. Der führende Unterstrich bedeutet: Finger weg, das ist keine öffentliche API. Schon ziemlich lange ist das `threading`-Modul die vorgesehene API für Threads. Wobei man bei Qt auch `QThread` ins Auge fassen sollte, denn das hat als `QObject` unterstützung für den Signal/Slot-Mechanismus und damit auch schon eine gute Möglichkeit um Daten von einem `QObject` an ein anderes zu übermitteln.

Die GUI würde ich übrigens nicht in einem Thread starten. Keine Ahnung wie Qt sich da verhält, aber die meisten GUI-Rahmenwerke laufen nur im ”Hauptthread” wirklich robust ohne dass man irgendwelche Besonderheiten auf der einen oder anderen Plattform beachten muss.

Edit: Und egal was Du machst: GUI-Elemente darf man nur aus dem Thread heraus verändern in dem die GUI-Hauptschleife läuft. Der Signal/Slot-Mechanismus ist dagegen thread-sicher.
Antworten