Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 9, 2012 14:54:30

mykola19121997@gmail.com
Зарегистрирован: 2012-08-09
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите плиз по Qt

Тема такая. Я учу Питон. После изучения скриптов и основ ООП стал учить 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)

Прикреплённый файлы:
attachment Unseccesfull result.png (6,6 KБ)

Офлайн

#2 Авг. 9, 2012 15:27:43

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

помогите плиз по Qt

Нужно добавить

window.setLayout(box)

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

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

Отредактировано reclosedev (Авг. 9, 2012 15:28:49)

Офлайн

#3 Авг. 9, 2012 15:45:09

mykola19121997@gmail.com
Зарегистрирован: 2012-08-09
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите плиз по Qt

reclosedev
Нужно добавить
window.setLayout(box)

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

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

Спасибо. Очень благодарен.

Офлайн

#4 Авг. 9, 2012 15:52:48

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

помогите плиз по Qt

В общем, создавать много кнопок с соединением сигналов лучше примерно так:

# -*- 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 или лямбд хватает.

Понимаю, что задача учебная, но зачем вообще столько кнопок? Можно ведь просто окно для ввода текста сделать?

Отредактировано reclosedev (Авг. 9, 2012 16:12:43)

Офлайн

#5 Авг. 9, 2012 16:40:36

mykola19121997@gmail.com
Зарегистрирован: 2012-08-09
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите плиз по Qt

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 или лямбд хватает.

Понимаю, что задача учебная, но зачем вообще столько кнопок? Можно ведь просто окно для ввода текста сделать?
Спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version