Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2016, 12:42   #1
kos94ok
Пользователь
 
Регистрация: 27.12.2010
Сообщений: 28
По умолчанию Две строки с кнопками

Здравствуйте еще раз. Вновь столкнулся с проблемой но уже другого характера. Мне нужно сделать две строки кнопок их всего 61 шт что бы они были в верхнем углу таблицы.Потом не надо сделать так что бы я нажимал на кнопку а потом на ячейку и туда вставала картинка(а у меня наоборот) и пока нажата кнопка я вставляю тот символ в ячейку пока не выберу другую кнопку.
Вот собственно мой черновик.(тут на примере всего две кнопки дабы код был меньше)
Код:
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from functools import partial




class Icons(QtGui.QWidget):
    def __init__(self, parent=None):
           QtGui.QWidget.__init__(self, parent)
           self.table = QtGui.QTableWidget(self)
           self.table.setRowCount(20)
           self.table.setColumnCount(20)
           self.table.setGeometry(0, 29, 1600, 1600)
           self.table.verticalHeader()
           self.table.horizontalHeader()
           self.table.show()
           self.table.horizontalHeader().hide()
           self.table.verticalHeader().hide()
        # test
           self.table.setColumnWidth(0, 30)
           self.table.setRowHeight(0, 30)
           self.table.resizeColumnsToContents()
           #self.table.resizeRowsToContents()
           self.setGeometry(300, 300, 800, 600)
           self.setWindowTitle('icon')
#################################################################################
           self.lay = QtGui.QHBoxLayout()
           self.lay.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
           self.lay.setMargin(0)
           self.lay.setSpacing(0)
           self.setLayout(self.lay)
           self._buttns = [
               {'btn': None, 'text': u'', 'img': 'sym1.png', 'ico': 'sym1.png'},
               {'btn': None, 'text': u'', 'img': 'sym2.png', 'ico': 'sym2.png'}]

           for i in self._buttns:
               i["btn"] = QtGui.QPushButton(i["text"])
               i["btn"].setIcon(QtGui.QIcon(i["ico"]))
               i["btn"].clicked.connect(partial(self.on_clicked_btn, i["img"]))
               self.lay.addWidget(i["btn"])
##################################################################################
    def on_clicked_btn(self, img):
        _item = TableWidgetItem(img, "")

        self.table.setCellWidget(self.table.currentRow(), self.table.currentColumn(), _item)
##################################################################################

class TableWidgetItem(QtGui.QWidget):
    def __init__(self, icon, text):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        label = QtGui.QLabel()
        label.setPixmap(QtGui.QPixmap(icon))
        label.setAlignment(QtCore.Qt.AlignCenter)
        layout.addWidget(label)
#################################################################################



app = QtGui.QApplication(sys.argv)
qb = Icons()
qb.show()
sys.exit(app.exec_())

Последний раз редактировалось kos94ok; 03.12.2016 в 12:45.
kos94ok вне форума Ответить с цитированием
Старый 03.12.2016, 14:36   #2
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Привет! Вот наверное такого эффекта ты хотел ?

Код:
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from functools import partial


class Icons(QtGui.QWidget):
    def __init__(self, parent=None):

        QtGui.QWidget.__init__(self, parent)

        self.IMG = '';
        self.table = QtGui.QTableWidget(self)

        # http://pyqt.sourceforge.net/Docs/PyQt4/qtablewidget.html
        self.table.cellChanged.connect( self.cell_changed );
        self.table.cellClicked.connect( self.cell_clicked );

        self.table.setRowCount(20)
        self.table.setColumnCount(20)
        self.table.setGeometry(0, 29, 1600, 1600)
        self.table.verticalHeader()
        self.table.horizontalHeader()
        self.table.show()
        self.table.horizontalHeader().hide()
        self.table.verticalHeader().hide()
        # test
        self.table.setColumnWidth(0, 30)
        self.table.setRowHeight(0, 30)
        self.table.resizeColumnsToContents()
        #self.table.resizeRowsToContents()
        self.setGeometry(300, 300, 800, 600)
        self.setWindowTitle('icon')
        # =============================================================
        self.lay = QtGui.QHBoxLayout()
        self.lay.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
        self.lay.setMargin(0)
        self.lay.setSpacing(0)
        self.setLayout(self.lay)
        self._buttns = [
            {'btn': None, 'text': u'', 'img': 'sym1.png', 'ico': 'sym1.png'},
            {'btn': None, 'text': u'', 'img': 'sym2.png', 'ico': 'sym2.png'}]

        for i in self._buttns:
            i["btn"] = QtGui.QPushButton(i["text"])
            i["btn"].setIcon(QtGui.QIcon(i["ico"]))
            i["btn"].clicked.connect(partial(self.on_clicked_btn, i["img"]))
            self.lay.addWidget(i["btn"])
    # =============================================================
    def on_clicked_btn(self, img):
        self.IMG = img;

    # =============================================================
    def cell_changed( self, c_0, c_1 ):
        print('CHANGED: '+str(c_0)+'/'+str(c_1));

    # =============================================================
    def cell_clicked( self, c_0, c_1 ):
        print('CLICKED: '+str(c_0)+'/'+str(c_1));

        _item = TableWidgetItem( self.IMG, "");
        self.table.setCellWidget( c_0, c_1, _item);


##################################################################################

class TableWidgetItem(QtGui.QWidget):
    def __init__(self, icon, text):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        label = QtGui.QLabel()
        label.setPixmap(QtGui.QPixmap(icon))
        label.setAlignment(QtCore.Qt.AlignCenter)
        layout.addWidget(label)

#################################################################################

app = QtGui.QApplication(sys.argv)
qb = Icons()
qb.show()
sys.exit(app.exec_())
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 03.12.2016, 14:57   #3
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Было бы интересно вот еще что добавить! Человек ввобит весь узор.
А Чпу алгоритмически находит самый качественный путь для прохождения, и наносит нужный узор на перхность.

Получиться такая смесь, ЧПУ и ручной работы =)
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 03.12.2016, 15:30   #4
kos94ok
Пользователь
 
Регистрация: 27.12.2010
Сообщений: 28
По умолчанию

Да результат с кнопками достигнут(не понял зачем нужен print в функциях)
А как быть с layout мне нужно 61 кнопку разместить, если я их все добавляю в код то он мне делает их в одну длинную строчку на все окно, что не очень смотрится, как мне их скомпоновать в 2 строки?(просто с таким количеством кнопок не понимаю как это сделать)
Чпу?( не понял что это?)
У меня в дальнейшем план сделать что бы кнопка которая выбрана загоралась.
Потом чтобы я мог выделять ячейки в таблице и в то место которое я выделил вставлялся символ.
P.S Я тебя добавлю в программу как консультанта и помощника в создании программы))) (Когда доделаю)
kos94ok вне форума Ответить с цитированием
Старый 03.12.2016, 17:44   #5
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

ЧПУ, это когда компьютерная программа берет на себя управление над станком, мехинической частью. Подача резцов, головок и т.д.

Это конечно не идеальный код, но как пример думаю пойдет.

Вообще такой подход к позиционированию объектов как я написал, не является самым верным.
Но зато он имеет свои плюсы.

Попробуй запусти код, поменяй значение в переменных, и позиционирование булет автоматически подстраиваться с учетом всех входных.
Код:
btn_w = 30;         # button width  | 30
btn_h = 30;         # button height | 30
total_btn_rows = 2; # buttons rows  | 2
Все сразу.

Код:
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from functools import partial


class Icons(QtGui.QWidget):
    def __init__(self, parent=None):

        # -------------------------------------------------
        QtGui.QWidget.__init__(self, parent)
        self.setGeometry(10, 10, 960, 650)
        self.setWindowTitle('icon')

        # -------------------------------------------------
        self.IMG = '';
        self.COLS = 38; # 38
        self.ROWS = 20; # 20
        self.SIZE = { 'W': 24, 'H': 24}; # 24 / 24

        # -------------------------------------------------
        self.table = QtGui.QTableWidget(self)

        self.table.setGeometry(
            0,  # margin left
            105, # margin top
            ((self.COLS+1)*self.SIZE['W']), # width
            ((self.ROWS+1)*self.SIZE['H']), # heigh
        );

        self.table.verticalHeader().hide();
        self.table.horizontalHeader().hide();

        self.table.setRowCount( self.ROWS );
        self.table.setColumnCount( self.COLS );


        self.table.cellClicked.connect( self.cell_clicked );

        for _col in xrange(0, self.COLS ):
            self.table.setColumnWidth( _col, self.SIZE['W'] );

        for _row in xrange(0, self.ROWS ):
            self.table.setRowHeight( _row, self.SIZE['H'] );


        #self.table.resizeColumnsToContents()
        #self.table.resizeRowsToContents()


        # =============================================================
        self.IMGS = [
            {'text': '', 'img': 'sym1' }, {'text': '', 'img': 'sym2' }, 
            {'text': '', 'img': 'sym3' }, {'text': '', 'img': 'sym4' }, 
            {'text': '', 'img': 'sym5' }, {'text': '', 'img': 'sym6' }, 
            {'text': '', 'img': 'sym7' }, {'text': '', 'img': 'sym8' }, 
            {'text': '', 'img': 'sym9' }, {'text': '', 'img': 'sym10' }, 
            {'text': '', 'img': 'sym11' }, {'text': '', 'img': 'sym12' }, 
            {'text': '', 'img': 'sym13' }, {'text': '', 'img': 'sym14' }, 
            {'text': '', 'img': 'sym15' }, {'text': '', 'img': 'sym16' }, 
            {'text': '', 'img': 'sym17' }, {'text': '', 'img': 'sym18' }, 
            {'text': '', 'img': 'sym19' }, {'text': '', 'img': 'sym20' }, 
            {'text': '', 'img': 'sym21' }, {'text': '', 'img': 'sym22' }, 
            {'text': '', 'img': 'sym23' }, {'text': '', 'img': 'sym24' }, 
            {'text': '', 'img': 'sym25' }, {'text': '', 'img': 'sym26' }, 
            {'text': '', 'img': 'sym27' }, {'text': '', 'img': 'sym28' }, 
            {'text': '', 'img': 'sym29' }, {'text': '', 'img': 'sym30' }, 
            {'text': '', 'img': 'sym31' }, {'text': '', 'img': 'sym32' }, 
            {'text': '', 'img': 'sym33' }, {'text': '', 'img': 'sym34' }, 
            {'text': '', 'img': 'sym35' }, {'text': '', 'img': 'sym36' }, 
            {'text': '', 'img': 'sym37' }, {'text': '', 'img': 'sym38' }, 
            {'text': '', 'img': 'sym39' }, {'text': '', 'img': 'sym40' }, 
            {'text': '', 'img': 'sym41' }, {'text': '', 'img': 'sym42' }, 
            {'text': '', 'img': 'sym43' }, {'text': '', 'img': 'sym44' }, 
            {'text': '', 'img': 'sym45' }, {'text': '', 'img': 'sym46' }, 
            {'text': '', 'img': 'sym47' }, {'text': '', 'img': 'sym48' }, 
            {'text': '', 'img': 'sym49' }, {'text': '', 'img': 'sym50' }, 
            {'text': '', 'img': 'sym51' }, {'text': '', 'img': 'sym52' }, 
            {'text': '', 'img': 'sym53' }, {'text': '', 'img': 'sym54' }, 
            {'text': '', 'img': 'sym55' }, {'text': '', 'img': 'sym56' }, 
            {'text': '', 'img': 'sym57' }, {'text': '', 'img': 'sym58' }, 
            {'text': '', 'img': 'sym59' }, {'text': '', 'img': 'sym60' }, 
            {'text': '', 'img': 'sym61' }, {'text': '', 'img': 'sym62' },
        ];

        btn_w = 30;         # button width  | 30
        btn_h = 30;         # button height | 30
        total_btn_rows = 2; # buttons rows  | 2

        btn_pos_x = 0;
        btn_pos_y = 1;
        ttl_btns = len(self.IMGS);
        btn_margin_top = 5;

        self.BTNS = [];
        for i in xrange(0, ttl_btns):

            self.BTNS.append( 
                QtGui.QPushButton( QtGui.QIcon( self.IMGS[i]["img"]+'.png'), self.IMGS[i]["text"], self ) );

            self.BTNS[ i ].clicked.connect( partial(self.select_image, self.IMGS[i]["img"]+'.png') );

            self.BTNS[ i ].setGeometry( btn_w * btn_pos_x, (btn_h*btn_pos_y)+btn_margin_top, btn_w, btn_h );

            btn_pos_x += 1;

            if btn_pos_x >= (ttl_btns / total_btn_rows):
                btn_pos_x = 0;
                btn_pos_y += 1;

    # =============================================================
    def select_image(self, img):
        self.IMG = img;

    # =============================================================
    def cell_clicked( self, c_0, c_1 ):
        _item = TableWidgetItem( self.IMG, "");
        self.table.setCellWidget( c_0, c_1, _item);

##################################################################################

class TableWidgetItem(QtGui.QWidget):
    def __init__(self, icon, text):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        label = QtGui.QLabel()
        label.setPixmap(QtGui.QPixmap(icon))
        label.setAlignment(QtCore.Qt.AlignCenter)
        layout.addWidget(label)

#################################################################################

app = QtGui.QApplication(sys.argv)
qb = Icons()
qb.show()
sys.exit(app.exec_())
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 03.12.2016, 17:49   #6
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Вообще вот от этого можно отказаться, если все картинки будут называться вот,

img_0, img_1, img_61;

То цикл ожно будет написать вот такой.

Код:
        # =============================================================
        btn_w = 30;         # button width  | 30
        btn_h = 30;         # button height | 30
        total_btn_rows = 2; # buttons rows  | 2

        btn_pos_x = 0;
        btn_pos_y = 1;
        ttl_btns = 62
        btn_margin_top = 5;

        self.BTNS = [];

        for i in xrange(0, ttl_btns):

            self.BTNS.append( 
                QtGui.QPushButton( QtGui.QIcon('sym'+str(i)+'.png'), '', self ) );

            self.BTNS[ i ].clicked.connect( partial(self.select_image, 'sym'+str(i)+'.png') );
            self.BTNS[ i ].setGeometry( btn_w * btn_pos_x, (btn_h*btn_pos_y)+btn_margin_top, btn_w, btn_h );

            btn_pos_x += 1;

            if btn_pos_x >= (ttl_btns / total_btn_rows):
                btn_pos_x = 0;
                btn_pos_y += 1;

Цитата:
P.S Я тебя добавлю в программу как консультанта и помощника в создании программы))) (Когда доделаю)
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 03.12.2016, 18:47   #7
kos94ok
Пользователь
 
Регистрация: 27.12.2010
Сообщений: 28
По умолчанию

Все работает но как то все не красиво =)(я теперь вообще свой код не узнаю=))
И возможно не совсем подходит.
Ведь есть вот этот класс QHBoxLayout который компонует по горизонтали.
Я хотел разбить по 30 кнопок с помощью 2х layout, но оказалось нельзя.
Хочется что бы код был яснее.
kos94ok вне форума Ответить с цитированием
Старый 03.12.2016, 19:04   #8
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Можно как душе будет угодно язык позволят.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 03.12.2016, 19:31   #9
kos94ok
Пользователь
 
Регистрация: 27.12.2010
Сообщений: 28
По умолчанию

Язык то позволяет, а знания пока нет. Мне не главное просто взять чужой код и вставить в свой. Для меня главное понимать что при этом происходит.
У тебя то все круто получилось))) Работает как надо.Спасибо, буду переваривать)
kos94ok вне форума Ответить с цитированием
Старый 03.12.2016, 19:42   #10
kos94ok
Пользователь
 
Регистрация: 27.12.2010
Сообщений: 28
По умолчанию

Вот это растягивает таблицу от количества ячеек?
Код:
self.IMG = '';
        self.COLS = 10; # 38
        self.ROWS = 20; # 20
        self.SIZE = { 'W': 24, 'H': 24}; # 24 / 24

        # -------------------------------------------------
        self.table = QtGui.QTableWidget(self)

        self.table.setGeometry(
            0,  # margin left
            105, # margin top
            ((self.COLS+1)*self.SIZE['W']), # width
            ((self.ROWS+1)*self.SIZE['H']), # heigh
kos94ok вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на строки. Даны две строки. Определить можно ли из символов первой строки получить вторую строку.( написать подпрограммой и ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 5 09.02.2013 14:07
Цик отвечающий за деление строки на две под строки А-р-т-ё-м Помощь студентам 1 13.11.2011 19:40
сравнить две строки. С++ Демик Помощь студентам 12 03.04.2011 21:54
сравнить две строки maxs7 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 01.10.2010 05:27
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27