Найти - Пользователи
Полная версия: помогите плиз по Qt
Начало » GUI » помогите плиз по Qt
1
mykola19121997@gmail.com
Тема такая. Я учу Питон. После изучения скриптов и основ ООП стал учить PyQt4. Для закрепления навыков решил создать свой собственныйг рафический кодировщик в Азбуку Морзес с текстовым полем , экранной клавой и клавищей “Encode”, после нажатия которой весь текст в текстовом поле кодировался в Морзе. Вот фрагметн исходного кода.
""" Тут следует описание функций кнопок и импорт модулей(Это я пропускаю в этом тектсте) """
#Теперь опишу GUI:
app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
window.setWindowTitle("Morse code encoder")
window.resize(600,550)
text1 = QtGui.QString("")
text1.setAlignment(QtCore.Qt.AlignCenter)
btnencode = QtGui.QPushButton("Encode")
btna = QtGui.QPushButton("a")
btnb = QtGui.QPushButton("b")
btnc = QtGui.QPushButton("c")
btnd = QtGui.QPushButton("d")
btne = QtGui.QPushButton("e")
btnf = QtGui.QPushButton("f")
btng = QtGui.QPushButton("g")
btnh = QtGui.QPushButton("h")
btni = QtGui.QPushButton("i")
btnj = QtGui.QPushButton("j")
btnk = QtGui.QPushButton("k")
btnl = QtGui.QPushButton("l")
btnm = QtGui.QPushButton("m")
btnn = QtGui.QPushButton("n")
btno = QtGui.QPushButton("o")
btnp = QtGui.QPushButton("p")
btnq = QtGui.QPushButton("q")
btnr = QtGui.QPushButton("r")
btns = QtGui.QPushButton("s")
btnt = QtGui.QPushButton("t")
btnu = QtGui.QPushButton("u")
btnv = QtGui.QPushButton("v")
btnw = QtGui.QPushButton("w")
btnx = QtGui.QPushButton("x")
btny = QtGui.QPushButton("y")
btnz = QtGui.QPushButton("z")
btn1 = QtGui.QPushButton("1")
btn2 = QtGui.QPushButton("2")
btn3 = QtGui.QPushButton("3")
btn4 = QtGui.QPushButton("4")
btn5 = QtGui.QPushButton("5")
btn6 = QtGui.QPushButton("6")
btn7 = QtGui.QPushButton("7")
btn8 = QtGui.QPushButton("8")
btn9 = QtGui.QPushButton("9")
btn0 = QtGui.QPushButton("0")
btndot = QtGui.QPushButton(".")
btncoma = QtGui.QPushButton(",")
btnquest = QtGui.QPushButton("?")
btnapostrof = QtGui.QPushButton("\'")
btnobr = QtGui.QPushButton("(")
btncbr = QtGui.QPushButton(")")
btncon = QtGui.QPushButton("&")
btn2dt = QtGui.QPushButton(":")
btndtcm = QtGui.QPushButton(";")
btnequal = QtGui.QPushButton("=")
btnplus = QtGui.QPushButton("+")
btnmin = QtGui.QPushButton("-")
btnut = QtGui.QPushButton("_")
btndg = QtGui.QPushButton("@")
btnUSD = QtGui.QPushButton("$")
btnspace = QtGui.QPushButton(" ")
btnquot = QtGui.QPushButton("\"")
btnrtslash = QtGui.QPushButton("/")
btnatten = QtGui.QPushButton("!")
btnQuit = QtGui.QPushButton("&Close App(ALT+C)")
box = QtGui.QVBoxLayout()
box.addWidget(text1)
box.addWidget(btnencode)
box.addWidget(btna)
box.addWidget(btnb)
box.addWidget(btnc)
box.addWidget(btnd)
box.addWidget(btne)
box.addWidget(btnf)
box.addWidget(btng)
box.addWidget(btnh)
box.addWidget(btni)
box.addWidget(btnj)
box.addWidget(btnk)
box.addWidget(btnl)
box.addWidget(btnm)
box.addWidget(btnn)
box.addWidget(btno)
box.addWidget(btnp)
box.addWidget(btnq)
box.addWidget(btnr)
box.addWidget(btns)
box.addWidget(btnt)
box.addWidget(btnu)
box.addWidget(btnv)
box.addWidget(btnw)
box.addWidget(btnx)
box.addWidget(btny)
box.addWidget(btnz)
box.addWidget(btn1)
box.addWidget(btn2)
box.addWidget(btn3)
box.addWidget(btn4)
box.addWidget(btn5)
box.addWidget(btn6)
box.addWidget(btn7)
box.addWidget(btn8)
box.addWidget(btn9)
box.addWidget(btn0)
box.addWidget(btndot)
box.addWidget(btncoma)
box.addWidget(btnquest)
box.addWidget(btnapostrof)
box.addWidget(btnobr)
box.addWidget(btncbr)
box.addWidget(btncon)
box.addWidget(btn2dt)
box.addWidget(btndtcm)
box.addWidget(btnequal)
box.addWidget(btnplus)
box.addWidget(btnmin)
box.addWidget(btnut)
box.addWidget(btndg)
box.addWidget(btnUSD)
box.addWidget(btnspace)
box.addWidget(btnquot)
box.addWidget(btnrtslash)
box.addWidget(btnatten)
box.addWidget(btnQuit)
""" Далее привязываю кнокпи к соответствующим функциям для них (Это я пропускаю в этом тектсте)"""
#Ну и наконец:
window.show()
sys.exit(app.exec_())

Вроде всё правильно , но результат был такой:

Как это зафиксовать?
reclosedev
Нужно добавить
window.setLayout(box)

На будущее: код пишите в тегах code
[code python]
код
код
код
[/code]

Вручную создавать кнопку на каждый символ и подключать сигналы к каждой кнопке - это непрактично (мягко говоря).
Сейчас попробую набросать вариант.
mykola19121997@gmail.com
reclosedev
Нужно добавить
window.setLayout(box)

На будущее: код пишите в тегах code
[code python]
код
код
код
[/code]

Вручную создавать кнопку на каждый символ и подключать сигналы к каждой кнопке - это непрактично (мягко говоря).
Сейчас попробую набросать вариант.

Спасибо. Очень благодарен.
reclosedev
В общем, создавать много кнопок с соединением сигналов лучше примерно так:
# -*- coding: utf-8 -*-
import string
import functools
 
from PyQt4 import QtCore, QtGui
 
 
NCOLUMNS = 10
SYMBOLS = string.ascii_lowercase + string.digits + string.punctuation
 
class MainWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        layout = QtGui.QGridLayout()
        row = column = 0
        for symbol in SYMBOLS:
            button = QtGui.QPushButton(symbol)
            button.clicked.connect(functools.partial(self._on_button_pressed,
                                                     symbol))
            layout.addWidget(button, row, column)
            column += 1
            if column >= NCOLUMNS:
                column = 0
                row += 1
        self.setLayout(layout)
       
    def _on_button_pressed(self, text):
        print text
        # and do something else with this text
        
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())
Плюс в примере используется QGridLayout, который больше подходит, но с удобным расположением надо поиграться самому.

Еще есть QSignalMapper, но в основном functools.partial или лямбд хватает.

Понимаю, что задача учебная, но зачем вообще столько кнопок? Можно ведь просто окно для ввода текста сделать?
mykola19121997@gmail.com
reclosedev
В общем, создавать много кнопок с соединением сигналов лучше примерно так:
# -*- coding: utf-8 -*-
import string
import functools
 
from PyQt4 import QtCore, QtGui
 
 
NCOLUMNS = 10
SYMBOLS = string.ascii_lowercase + string.digits + string.punctuation
 
class MainWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        layout = QtGui.QGridLayout()
        row = column = 0
        for symbol in SYMBOLS:
            button = QtGui.QPushButton(symbol)
            button.clicked.connect(functools.partial(self._on_button_pressed,
                                                     symbol))
            layout.addWidget(button, row, column)
            column += 1
            if column >= NCOLUMNS:
                column = 0
                row += 1
        self.setLayout(layout)
       
    def _on_button_pressed(self, text):
        print text
        # and do something else with this text
        
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())
Плюс в примере используется QGridLayout, который больше подходит, но с удобным расположением надо поиграться самому.

Еще есть QSignalMapper, но в основном functools.partial или лямбд хватает.

Понимаю, что задача учебная, но зачем вообще столько кнопок? Можно ведь просто окно для ввода текста сделать?
Спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB