Форум сайта python.su
Тема такая. Я учу Питон. После изучения скриптов и основ ООП стал учить 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_())
Отредактировано mykola19121997@gmail.com (Авг. 9, 2012 15:50:19)
Прикреплённый файлы:
Unseccesfull result.png (6,6 KБ)
Офлайн
Нужно добавить
window.setLayout(box)
[code python]
код
код
код
[/code]
Отредактировано reclosedev (Авг. 9, 2012 15:28:49)
Офлайн
reclosedev
Нужно добавитьwindow.setLayout(box)
На будущее: код пишите в тегах code[code python]
код
код
код
[/code]
Вручную создавать кнопку на каждый символ и подключать сигналы к каждой кнопке - это непрактично (мягко говоря).
Сейчас попробую набросать вариант.
Офлайн
В общем, создавать много кнопок с соединением сигналов лучше примерно так:
# -*- 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_())
Отредактировано reclosedev (Авг. 9, 2012 16:12:43)
Офлайн
reclosedevСпасибо!
В общем, создавать много кнопок с соединением сигналов лучше примерно так:Плюс в примере используется QGridLayout, который больше подходит, но с удобным расположением надо поиграться самому.# -*- 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_())
Еще есть QSignalMapper, но в основном functools.partial или лямбд хватает.
Понимаю, что задача учебная, но зачем вообще столько кнопок? Можно ведь просто окно для ввода текста сделать?
Офлайн