Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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



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

Здравствуйте еще раз. Вновь столкнулся с проблемой но уже другого характера. Мне нужно сделать две строки кнопок их всего 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 в 13:45.
kos94ok вне форума   Ответить с цитированием
Старый 03.12.2016, 15:36   #2
pompiduskus
юзер как все
Профессионал
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Адрес: земля
Сообщений: 1,290
Репутация: 522

icq: 446.452.423
По умолчанию

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

Код:

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_())

__________________
<Дзен - Вся вселенная в тебе > | <Рай - это всего лишь мечта терпящего страдания ада> | github.com/ch3ll0v3k
pompiduskus вне форума   Ответить с цитированием
Старый 03.12.2016, 15:57   #3
pompiduskus
юзер как все
Профессионал
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Адрес: земля
Сообщений: 1,290
Репутация: 522

icq: 446.452.423
По умолчанию

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

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

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

icq: 446.452.423
По умолчанию

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

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

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

Попробуй запусти код, поменяй значение в переменных, и позиционирование булет автоматически подстраиваться с учетом всех входных.
Код:

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_())

__________________
<Дзен - Вся вселенная в тебе > | <Рай - это всего лишь мечта терпящего страдания ада> | github.com/ch3ll0v3k
pompiduskus вне форума   Ответить с цитированием
Старый 03.12.2016, 18:49   #6
pompiduskus
юзер как все
Профессионал
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Адрес: земля
Сообщений: 1,290
Репутация: 522

icq: 446.452.423
По умолчанию

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

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 Я тебя добавлю в программу как консультанта и помощника в создании программы))) (Когда доделаю)
__________________
<Дзен - Вся вселенная в тебе > | <Рай - это всего лишь мечта терпящего страдания ада> | github.com/ch3ll0v3k
pompiduskus вне форума   Ответить с цитированием
Старый 03.12.2016, 19:47   #7
kos94ok
Пользователь
 
Регистрация: 27.12.2010
Сообщений: 28
Репутация: 10
По умолчанию

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

icq: 446.452.423
По умолчанию

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

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

Вот это растягивает таблицу от количества ячеек?
Код:

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 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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




01:30.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru