Форум сайта python.su
Привет!
Возникла проблема в курсовой, идей никаких
Есть входящий txt файл
Вида:
- - k
- k -
k - -
на основе него нужно построить допустим “-” это button, а “k” это TextEdit это впрочем не так важно что будет, нужна сама идея как это реализовать, а если и с примерчиком
Отредактировано INTJOGE (Апрель 15, 2012 12:46:23)
Офлайн
Где конкретно проблемы возникают?
Для создания виджетов можно сделать словарь с записями вида: код_виджета -> фабрика_виджета.
Для динамического добавления виджетов - использовать QGridLayout.
Вот простой пример:
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys from PyQt4 import QtCore, QtGui widget_factory_by_type = { '-': QtGui.QPushButton, 'k': QtGui.QLineEdit, } def create_widget(widget_type): return widget_factory_by_type[widget_type]() class CustomWidget(QtGui.QWidget): def load_widgets_from_string(self, data): table = [line.split() for line in data.splitlines() if line] layout = QtGui.QGridLayout() for i, row in enumerate(table): for j, widget_type in enumerate(row): widget = create_widget(widget_type) layout.addWidget(widget, i, j) self.setLayout(layout) if __name__ == "__main__": test_string = """ - - k - k - k - - """ app = QtGui.QApplication(sys.argv) window = CustomWidget() window.resize(640, 480) window.load_widgets_from_string(test_string) window.show() sys.exit(app.exec_())
Отредактировано reclosedev (Апрель 15, 2012 14:19:56)
Офлайн
reclosedevДа проблема возникла именно в этом, как вытащить инфу из файла, и на основе нее построить то что я хочу.
Где конкретно проблемы возникают?
Офлайн
Про чтение из файла можно почитать в официальном учебнике Methods of File Objects.
Обработка файла будет зависть от придуманного вами формата. Для кода из моего примера можно заменить test_string = … на
with open('data.txt') as f: test_string = f.read()
Отредактировано reclosedev (Апрель 15, 2012 15:52:22)
Офлайн
Спасибо за пример и подробное пояснение! + вам)
Офлайн
У меня еще возникло пару вопросов
http://s56.radikal.ru/i151/1204/36/01169b5d8a5d.jpg
1) У меня что-то не выходит закрасить элемент item1 черным цветом
2) Второй вопрос про кнопки, как можно сделать так чтоб между ними не было отступа
Отредактировано INTJOGE (Апрель 16, 2012 12:25:08)
Офлайн
INTJOGEА cell.Cell() - это что, наследник QGraphicsRectItem? Тогда можно попробовать item1.setBrush(QBrush(Qt.black)).
1) У меня что-то не выходит закрасить элемент item1 черным цветом
INTJOGElayout.setSpacing(0), но маленький отступ все равно будет.
2) Второй вопрос про кнопки, как можно сделать так чтоб между ними не было отступа
Отредактировано reclosedev (Апрель 16, 2012 17:54:40)
Офлайн
reclosedevДа это наследник QGraphicsRectItem, так я пробовал но что-то было не то
А cell.Cell() - это что, наследник QGraphicsRectItem? Тогда можно попробовать item1.setBrush(QBrush(Qt.black)).
reclosedevЭто тоже пробовал но думал что до упора можно придвинуть кнопки.
layout.setSpacing(0), но маленький отступ все равно будет.
Офлайн
И опять я тут Сразу извиняюсь за надоедливость
Я так понял ругается он на QtGui.QGroupBox(“Prewiew”) но что-то догнать в чем именно дело не могу.
Ошибка: http://s50.radikal.ru/i127/1204/35/f3ad6aadc37a.png
Непосредственно я хочу чтоб сетка просто обновилась, межет я вообще не туда копаю
Вызов функции на нажатие кнопки Generation
def buttonGenClick(self): a = crossword.Crossword(10, 10, '-', 5000, crossword.word_list) a.compute_crossword(2) sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setLableWorld.txt', "w" ) print a.word_bank() sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setGrid.txt', "w" ) print a.solution() #print a.word_find() sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setNumGrid.txt', "w" ) print a.display() sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setQuare.txt', "w" ) print a.legend() sys.stdout = open('C:\Users\INTJOGE\Desktop\PyCross\OutFile\setNumQuare.txt', "w" ) print len(a.current_word_list), 'out of', len(crossword.word_list) print a.debug self.createGrid(test_string)
def createGrid(self, data): self.createGrid = QtGui.QGroupBox("Prewiew") table = [line.split() for line in data.splitlines() if line] layout = QtGui.QGridLayout() for i, table in enumerate(table): for j, table in enumerate(table): if table == '-': buttons = QtGui.QPushButton("") buttons.setStyleSheet("background-color:black;") buttons.setFixedSize(20,20) layout.addWidget(buttons, i, j) elif table == table: buttons = QtGui.QPushButton(table) buttons.setFixedSize(20,20) buttons.setStyleSheet("background-color:white;") buttons.setFont( QtGui.QFont("Arial", 10, QtGui.QFont.Bold)) layout.addWidget(buttons, i, j) self.createGrid.setLayout(layout)
Отредактировано INTJOGE (Апрель 17, 2012 14:52:37)
Офлайн
INTJOGE
Я так понял ругается он на QtGui.QGroupBox(“Prewiew”) но что-то догнать в чем именно дело не могу.
>>> class Foo(): def foo(self): print "OK!" self.foo='sdasdasd' >>> f=Foo() >>> f.foo() OK! >>> f.foo() Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> f.foo() TypeError: 'str' object is not callable >>>
def createGrid(self, data): self.createGrid = QtGui.QGroupBox("Prewiew")
Офлайн