Уведомления

Группа в Telegram: @pythonsu

Уведомления

  • Found 3494 posts.

Python для новичков » Требуется оценка специалиста (может занять некоторое время). » Окт. 23, 2014 09:07:44

Добрался до ООП. Вроде разобрался, и попробовал написать какой то код, чтобы попрактиковаться. Но как правило, первый блин комом, поэтому прошу соображающих в этом деле людей, указать на ошибки.

ПС: на английский переводить на стал, поэтому если русский текст ломает глаза, не читайте - я предупредил.


# Программа "Ходилка"
# С намёком на игру
# Смысл программы в том, что бы перемещать некий объект по карте
# и закрепить на практике теорию объектно ориентированного программирования.
# Питон 3.4
# Кодировка UTF-8
 
 
class Клетка(object):
    """Свойства и состояния клетки карты"""
  
    клетка = []
    дерево = "Х"
    пусто = " "
 
 
class Генератор2дМассива(object):
    """Генерирует двумерный массив из заданных параметров."""
 
    def генерация_массива(собств, вертикаль, горизонталь):
 
        массив = []
        for координата_У in range(вертикаль):
            массив.append([])
            for координата_Х in range(горизонталь):
                массив[координата_У].append([])
        # Возвращаем созданный массив:
        return массив
 
 
class ИгровойЭкран(Клетка, Генератор2дМассива):
    """Отображает на экране видимую область"""
 
    def __init__(собств, горизонталь=3, вертикаль=3):
        """
        Инициализирует игровой экран (зону видимости персонажа)
        :param горизонталь: задаёт размер экрана, по ширине,
        :param вертикаль: задаёт размер экрана, по высоте,
        :return:возвращает двумерный массив экрана
        """
 
        собств.экран = собств.создание_изображения_экрана(вертикаль, горизонталь)
        собств.ширина = горизонталь
        собств.высота = вертикаль
        собств.коорд_У = 1
        собств.коорд_Х = 1
        собств.выход = ""
 
    def перемещение_по_карте(собств, локация):
        """ Перемещает экран по карте локации. """
        # Начинаем цикл с запросом на перемещение.
        print(локация.высота)
        while собств.выход != "выход":
            print("координаты камеры : У =", собств.коорд_У, "Х =", собств.коорд_Х)
            # Осуществляем срез с карты локации для проецирования на экран.
            for ц in range(собств.высота):
                собств.экран[ц] = локация.карта[собств.коорд_У + ц]\
                    [собств.коорд_Х: собств.коорд_Х + собств.ширина]
            # Выводим изображение на экран и запрашиваем у пользователя направление движения.
            собств.изображение()
            направление = собств.запрос_направления()
            собств.изменение_координат(локация, направление)
 
    def изменение_координат(собств, локация, направление):
        "Изменяет координаты экрана (перемещает по карте)."
        print(локация.высота)
 
        # Перемещаем камеру.
        if направление == "север":
            собств.коорд_У -= 1
        elif направление == "юг":
            собств.коорд_У += 1
        elif направление == "восток":
            собств.коорд_Х -= 1
        elif направление == "запад":
            собств.коорд_Х += 1
        elif направление == "выход":
            собств.выход = направление
            return собств.выход  # выход из программы.
        else:
            print("Фраза", направление, "- не является возможным направлением.")
        # Проверяем координаты экрана на достижение границ карты.
        if собств.коорд_У < 0:
            собств.коорд_У = 0
        elif собств.коорд_Х < 0:
            собств.коорд_Х = 0
        elif собств.коорд_У >= локация.высота - собств.высота:
            собств.коорд_У = локация.высота - собств.высота
        elif собств.коорд_Х >= локация.ширина - собств.ширина:
            собств.коорд_Х = локация.ширина - собств.ширина
 
        # Возвращаем координаты камеры.
        return собств.коорд_Х, собств.коорд_У
 
    def запрос_направления(собств):
        """Запрашивает у пользователя направление движения."""
        НАПРАВЛЕНИЕ = ["север", "юг", "запад", "восток", "выход"]
        направление = ""
        while направление not in НАПРАВЛЕНИЕ:
            направление = input(
                "Напишите, куда желаете направиться: север, юг, запад или восток? ").lower()
            if направление not in НАПРАВЛЕНИЕ:
                print("Неверная команда, попробуйте ещё раз.")
        return направление
 
    def изображение(собств):
        print(собств.экран[0][0], "|", собств.экран[1][0], "|", собств.экран[2][0])
        print("--------------")
        print(собств.экран[0][1], "|", собств.экран[1][1], "|", собств.экран[2][1])
        print("--------------")
        print(собств.экран[0][2], "|", собств.экран[1][2], "|", собств.экран[2][2])
 
    def создание_изображения_экрана(собств, вертикаль=3, горизонталь=3):
        экран = собств.генерация_массива(вертикаль, горизонталь)
        return экран
 
 
class КартаЛокации(Клетка, Генератор2дМассива):
    """Пространство, по которому перемещается герой"""
 
    def __init__(собств, горизонталь=10, вертикаль=10):
        """Создаёт карту локации и расставляет на ней деревья."""
        собств.карта = собств.генерация_карты(вертикаль, горизонталь)
        собств.высота = вертикаль
        собств.ширина = горизонталь
 
    # Эта программа герерирует двумерный массив карты и объекты на ней.
    def генерация_карты(собств, вертикаль=10, горизонталь=10):
        """ Генерирует карту, и расставляет на ней деревья."""
        import random
 
        карта = собств.генерация_массива(вертикаль, горизонталь)
        # Расставляем обозначения на карту.
        for у in range(вертикаль):
            for х in range(горизонталь):
                выбор_объекта = random.randint(0, 3)
                if выбор_объекта <= 1:
                    карта[у][х].append(собств.пусто)
                else:
                    карта[у][х].append(собств.дерево)
        return карта
 
 
локация1 = КартаЛокации()
экран = ИгровойЭкран()
экран.перемещение_по_карте(локация1)
 

Django » Ищу специалиста » Окт. 22, 2014 03:38:52

Доброго времени суток
Разыскиваеться специалист по Django cms, есть незаконченный проект, програмист потерялся.
Обязательно дальнейшее постоянное сотрудничество.
ТЗ проекта, багов и новых доработок в разработке.
По цене договоримся.

Требования:

- Пунктуальность и работоспособность;
- Отличные знания и опыт от 1 года с Python/Django
- south, миграции, сложные sql-запросы/оптимизация запросов
- jquery/AJAX - хорошие знания

Оплата - webmoney, наличный расчёт Саратов
Контакт icq 997один797

GUI » PyQt4 проверка регистрации в БД » Окт. 21, 2014 09:37:38

Привет!
Прошу сразу не называть меня идиотом, ибо я просто новичок в питоне и в программирование в целом.
Возможно вопрос покажется глупым, но все же очень прошу помощи.

Вопрос:
Пытаюсь написать окно регистрации в БД Firebird. Путем гугл и изучения книги PyQt имею такой код, в котором разобрался как смог:

#-*-coding: utf-8 -*-
from PyQt4 import QtCore, QtGui, QtSql
import sys
import kinterbasdb
class LoginWindow(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        
        self.lineEditName = QtGui.QLineEdit()
        self.lineEditDbase = QtGui.QLineEdit()
        self.lineEditPass = QtGui.QLineEdit()
        self.lineEditIp = QtGui.QLineEdit()
        self.lineEditPass.setEchoMode(2)  
        self.buttonOk = QtGui.QPushButton("Ok")              
        self.hbox = QtGui.QHBoxLayout()
        self.hbox.addWidget(self.buttonOk)
        self.form =QtGui.QFormLayout()
        self.form.addRow("Login:", self.lineEditName)
        self.form.addRow("Pass:", self.lineEditPass)
        self.form.addRow("BD:", self.lineEditDbase)
        self.form.addRow("Ip:", self.lineEditIp)
        self.form.addRow(self.hbox)
        self.setLayout(self.form)
        self.lineEditPass.setFocus()
        
        self.buttonOk.clicked.connect(self.on_Ok)
    def on_Ok(self):
       
        
        host = "192.168.1.88:E:\BD\BD1.FDB"
        BDUSER = "XXXX"
        BDPASSWORD = "XXX" 
        #raw_input ("password   ")
        con = kinterbasdb.connect(dsn=host,user=BDUSER,password=BDPASSWORD)
        cur = con.cursor()
        cur.execute('SELECT* FROM TABLE1')
        for row in cur:
            print 'ID', row[0]
            print 'NAME', row[1]
        
        
#Окно для подтверждения закрытия       
    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()
app = QtGui.QApplication(sys.argv)
win = LoginWindow()
win.show()              
sys.exit(app.exec_())


Вопрос 1: как организовать проверку логина и пароля БД? Я так понял нужно присвоить значения поля соответствующей переменой. Но как это сделать не могу нагуглить.

Вопрос 2: При неправильном вводе логин\пароль или путь до бд, будут выдаваться ошибки, как эти ошибки разделить и обозначить пользователю?

Вопрос 3: По какой то причине, если я вставляю кнопку “Cancel” и задаю на него подтверждения закрытия, кнопка “Ok” перестает работать. Что это может быть.


Если можно приведите пример кода, или хотя бы дайте ссылку где посмотреть. Заранее спасибо.

GUI » взаимодействие sqlite3 и формы. Необх срочн помощь » Окт. 19, 2014 16:18:34

Кароч есть прога . Мне необходимо чтобы при вводе на дочерней форме данные заносились в базу даннах, а потом в главном окте отображались в таблице. Народ требуется помощь.
#!/usr/bin/python
#-*- coding:utf-8 -*-
from tkinter import *
from tkinter import ttk
import sqlite3
# класс главного окна
class main:
  def __init__(self, master):
    self.master = master
    self.master.title('parent')
    self.master.geometry('600x400+300+225')
    self.button = Button(self.master,
                         text = 'myButton',
                         command = self.openDialog)
    self.button.grid()
    self.edit = Entry(self.master)
    self.edit.grid()
    #создание таблицы
    t=ttk.Treeview(self.master,show='headings', selectmode='browse', height=20)
    # Даем заголовки колонкам
    t["columns"]=("im","fam","otch")
    #регулируем колонки
    t.column("im",width=75,anchor="center" )
    t.column("fam", anchor= "center")
    t.column("otch", anchor= "center")
    #меняем название столбцов
    t.heading("im", text = "Имя")
    t.heading("fam",text="Фамилия")
    t.heading("otch",text="Отчество")
    #ввод данных
    t.insert("",0,values=("1","2"))
    t.grid()
    #Таблица завершена
    self.master.mainloop()
  def openDialog(self):
    child(self.master)
# класс дочерних окон
class child:
    def __init__(self, master):
        self.slave = Toplevel(master)
        self.slave.title('child')
        self.slave.geometry('200x150+500+375')
        self.edit= Entry(self.slave)
        self.edit.grid()
        self.art=Button(self.slave,
                        text="privet")
        self.art.grid()
        self.slave.grab_set()
        self.slave.focus_set()
        self.slave.wait_window()
        
        
# создание окна
root = Tk()
# запуск окна
main(root)
и есть файл в котором создается сама база с таблицей
from tkinter import *
import sqlite3
con= sqlite3.connect('maddb')
cur=con.cursor()
cur.execute('''CREATE TABLE fio(
        id INTEGER,
        im VARCHAR(10))''')

Флейм » Нужен опытный Python-программист для экспертизы материалов онлайн-курса по Python » Окт. 17, 2014 03:44:24

Здравствуйте, уважаемые форумчане.
Наш проект http://tutortalk.ru, написанный на Python/Django - ищет эксперта по Python.
Мы хотим разместить у себя курс по асинхронным фреймворкам Python - Twisted, Tornado, gevent, AMQP, celery.
Есть подробный план курса и ТЗ по исходным текстам курса. От эксперта требуется иметь перечисленный опыт, помогать с написанием исходных кодов, материалов курса, методически правильно их подавать, при желании - записывать сами лекции в качестве диктора.
Что вам это даст - авторство и подтверждение вашей квалификации как эксперта в Python (ведете курс - значит шарите в предмете), благодарные ученики курса, шеринг вашего опыта, плюсы в карму. Мы готовы оговаривать индивидуально условия сотрудничества, в зависимости от вашего вовлечения и опыта.
Пишите здесь в ЛС или на почту tutortalknet (at) gmail .com

Также мы готовы размещать курсы по другим IT-тематикам, подробнее: https://www.fl.ru/projects/2107830/

Network » Управление xbmc посредством curl через json-rpc. » Окт. 16, 2014 20:11:31

Дорогие коллеги!

Столкнулся с такой проблемой: нужно рулить оболочкой xbmc из моей программы на python 2.7.3, запущенной на той же машине.

Вот отсюда http://kodi.wiki/view/JSON-RPC_API/v6 были взяты нужные параметры и рождена вот такая строчка:
curl -H ‘Content-Type: application/json’ -d ‘{“jsonrpc”: “2.0”, “method”: “Input.Home”,“id”: 1}’ http://127.0.0.1:88/jsonrpc {“id”:1,“jsonrpc”:“2.0”,“result”:“OK”}

При вводе в командной строке она работает.
В моей программе она выглядит так:
    header=""" 'Content-Type: application/json'""" 
    data="""'{"jsonrpc": "2.0", "method": "Input.Home","id": 1}'""" 
    params="""{"id":1,"jsonrpc":"2.0","result":"OK"}"""
    call(['curl', '-H', header, '-d', data, 'http://127.0.0.1:88/jsonrpc', params])

Метод call импортирован из модуля subprocess
Код выполняется, ошибок не вызывает, но и никаких действий не производит.
Я понимаю, что проблема скорее всего в неправильной передаче параметров функции call, но решить ее пока не могу.

Подскажите пожалуйста, как стандартными средствами Python (т.е. без requests, PyCurl и т.п.) решить мою задачу.

Заранее спасибо Вам!

Флейм » Проект сетевого приложения. » Окт. 11, 2014 00:41:54

Добрый вечер, в комманду программистов нужен человек, который знаком с разработкой сетевых приложенией под Unix like системы и имеет опыт работы с многопоточностью. (твистед, асинхрон) Есть узкоспециализированная задача. Соотвественно, оплата не 3 копейки. Есть бриф на проект. Если будут заинтересованные люди, просьба писать на мейл
tiraen@gmail.com

либо kelewind_87 - скайп.

Более подробно, в почте или скайпе, так как проект сугубо коммерческий, просто делается на условиях фриланса.

P.S. Если с Киева, дабы была возможность личной встречи, будет вдвойне отлично.

Центр помощи » python post запрос 100 раз в секунду и больше кто поможет реализовать » Окт. 8, 2014 21:07:39

пример кода изначальный
def trade(ord_type, ord_rate, ord_amount, p):
    try:
        nonce = int(int(time.time()*10)%(10*60*60*24*366*10)-867780726+26000000)*2+1
        # method name and nonce go into the POST parameters
        params = {"method":"Trade",
                  "nonce": nonce,
                  "pair": p,
                  "type": ord_type,
                  "rate": ord_rate,
                  "amount": ord_amount}
        params = urllib.urlencode(params)
        # Hash the params string to produce the Sign header value
        H = hmac.new(BTC_secret, digestmod=hashlib.sha512)
        H.update(params)
        sign = H.hexdigest()
        headers = {"Content-type": "application/x-www-form-urlencoded",
                           "Key":BTC_key,
                           "Sign":sign}
        conn = httplib.HTTPSConnection("btc-e.com")
        conn.request("POST", "/tapi", params, headers)
        response = conn.getresponse()
        a = json.load(response)

что смог сделать для ускорения
def buy():
    x=get()
    i=0
    z=0
    while i<1:
        nonce = int(int(time.time()*10)%(10*60*60*24*366*10)-867780726+26000000)*2+1
        a=x+i
        i=i-0.002
        print a
        params={"method":"Trade",
                  "nonce": nonce,
                  "pair": "ppc_usd",
                  "type": "buy",
                  "rate": a,
                  "amount": 0.11}
        # method name and nonce go into the POST parameters
        params = urllib.urlencode(params)
       # Hash the params string to produce the Sign header value
        H = hmac.new(BTC_secret, digestmod=hashlib.sha512)
        H.update(params)
        sign = H.hexdigest()
        headers = {"Content-type": "application/x-www-form-urlencoded",
                           "Key":BTC_key,
                           "Sign":sign}
        conn = httplib.HTTPSConnection("btc-e.com")
        try:
		conn.request("POST", "/tapi", params, headers)
        except httplib.HTTPException:
            raise BTCEError("HTTP error: " + response.reason)
        if a<0.7:
            break

помогите плиз ускорить процесс

Базы данных » sqlalchemy groub by c блоками по времени » Окт. 3, 2014 20:50:45

Например ведется лог температуры в такую таблицу
table = Table('data', metadata,
              Column('id', Integer, primary_key=True, index=True),
              Column('created', TIMESTAMP, index=True),
              Column('temperature', Float))
Как из нее извлечь среднюю температуру блоками по времени, вот так:
От        До   Средняя температура
11.00   11.10   15.3
11.10   11.20   13.1
11.20   11.30   13.5
То что нужно использовать group_by() понятно, но как сделать разбиение по группах не могу понять.
Вот этим кодом (он не рабочей) хочу создать поле t_from которое будет округлять данные кратные периоду группировки (600 секунд или 10 минут).
time_step = 600
period_from = ...
perion_to = ...
 t_step = (datetime.datetime.min + datetime.timedelta(seconds=time_step)).time()  # convert seconds <type 'int'> to <type 'datetime.time'>
t_from = (((table.c.created - period_from)/t_step)*t_step + table.c.created).label('t_from')
table.select([t_from, table.c.temperature]).where(created.c.created.between(period_from, perion_to))
Как правильно сделать? Может кто подсказку даст?

Django » Создание документов MS Office из Django » Окт. 3, 2014 12:50:55

Доброго времени суток, уважаемые!
Подскажите пожалуйста как в Django можно реализовать следующее: есть ряд форм, данные из которых необходимо поместить в документы MS Office (word, excel), в качестве документов выступают заранее подготовленные шаблоны с разметкой. Как то натыкался на библиотеку для php реализующую подобный функционал для odf, возможно есть рецепт и для Django?
Спасибо.

Pyramid / Pylons / TurboGears » pyramid_skins - как использовать? » Окт. 2, 2014 10:37:06

Пользуется-ли кто pyramid_skins? Если да, покажите, пожалуйста, как сделать хоть хелловорлд какой, а то никак не пойму как этим пакетом пользоваться; и особенно интересна возможность декларативного описания в zcml.

Python для новичков » python3 + lxc » Сен. 26, 2014 15:09:15

Привет, кто-нибудь использует lxc + python3?
У меня возникли проблемы и я хотел бы задать вопросы

import lxc
m = lxc.Container('server')
my_gw = '192.168.1.1'
m.set_config_item('lxc.network.0.ipv4.gateway',my_gw)

Получаю
False
Не понимаю почему. Куда смотреть? Где копать документацию? Какие варианты set_config_item вообще есть?

Python для новичков » python273/vk_api работа от имени своего приложения » Сен. 26, 2014 06:48:17

Доброго времени суток. Проблема заключается в следующем. Есть код
import vk_api
import time
def main():
    login, password = '+7921*********', '***********'
                  
    try:
        vk = vk_api.VkApi(login, password, app_id = 4540191) 
    except vk_api.AuthorizationError as error_msg:
        print(error_msg)  
        return  # и выйдем
           
    values = {
             'owner_id':-77369731,
             'message':'test'
             }  
    try:        
        response = vk.method('wall.post', values)
        print 'True post'
    except:
        print 'Error Post'
    time.sleep(2)
         
          
if __name__ == '__main__':
    main()
Но я не могу переделать приложение от имени коего должна осуществляться публикация поста. Публикация осуществляется все равно по умолчанию от имени python. В описаний либы есть возможность смены id приложения. Вот
class VkApi(object):
    def __init__(self, login=None, password=None, number=None, token=None,
                 proxies=None, captcha_handler=None, config_filename=None,
                 api_version='5.24', app_id=2895443, scope=2097151):
        """
        :param login: Логин ВКонтакте
        :param password: Пароль ВКонтакте
        :param number: Номер для проверке безопасности (указывать, если
                                     в качестве логина используется не номер)
        :param token: access_token
        :param proxies: proxy server
                        {'http': 'http://127.0.0.1:8888/',
                        'https': 'https://127.0.0.1:8888/'}
        :param captcha_handler: Функция для обработки капчи
        :param config_filename: Расположение config файла
        :param api_version: Версия API (default: '5.21')
        :param app_id: Standalone-приложение (default: 2895443)
        :param scope: Запрашиваемые права (default: 2097151)
        """
Я не могу понять почему не меняется. Скорее всего я не правильно что-то делаю в первом блоке кода, а именно в определений объекта. Приложение в вк создано.

GUI » mplayerctrl » Сен. 23, 2014 11:51:54

Есть такая программка - из сети получает поток и воспроизводит его в mplayer.
import socket
import subprocess
import threading
def server():
    cmdline = 'mplayer -fps 30 -cache 1024 -'
    player = subprocess.Popen(cmdline.split(), stdin=subprocess.PIPE)
    while True:
        data = client.recv(1024)
        player.stdin.write(data)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 60000))
s.listen(1)
client, addr = s.accept()
thread = threading.Thread(target=server)
thread.daemon = True
thread.start()

Здесь все работает ок. Вопрос, как сделать тоже самое только с mplayerctrl и wxpython. Как организовать передачу данных в stdin mplayerctrl?. Как сделать pipe между server и процесом в виджете? В мануале к mplayerctrl есть только Loadfile.Если предварительно сохранять данные в файл, то работает, но это нето… вот код. Спасибо

import wx
import socket
import MplayerCtrl as mpc
import threading
class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY)
        self.mpc = mpc.MplayerCtrl(self, wx.ID_ANY, 'mplayer',mplayer_args=('-cache','1024','-fps','30','-'))
        self.Show()
       
def server():
    while True:
        data = client.recv(1024)
         
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 60000))
s.listen(1)
client, addr = s.accept()
application = wx.App()
Main = Frame()
thread = threading.Thread(target=server)
thread.daemon = True
thread.start()
application.MainLoop()

Python для новичков » NetCDF4: в цикле читать имена переменных NetCDF-файла и присваивать данные каждой переменной массиву  » Сен. 21, 2014 14:30:21

NetCDF4: в цикле читать имена переменных NetCDF-файла и присваивать данные каждой переменной своему массиву для дальнейшей манипуляции numpy'ем

“Типа”:

import os
import netCDF4
import numpy as np
Directory_Src='L:'+os.sep+'_Example'+os.sep
File_Src=Directory_Src+'Aug-Sep_2-50m.nc'
f = netCDF4.Dataset(File_Src, 'r')
for v in f.variables:
    print (v)
    #??? вот здесь присваивание данных каждой переменной своему массиву ???   

GUI » wxWidgets/Phoenix, кто установил? » Сен. 21, 2014 13:07:18

https://github.com/wxWidgets/Phoenix#how-to-build-phoenix

Прошу поделиться положительным опытом установки сего тулкита под линуксом.

Python для новичков » Установка PythonGI Windows проблемы » Сен. 19, 2014 19:24:26

Скачал PythonGI, при установке отметил путь к моему интерпритатору (Python 3.4), комплектацию везде указывал базовую. Он установился в \python\Lib\site-packages\, я попытался выполнить простейший HelloWorld:
#!/usr/bin/python
from gi.repository import Gtk
win = Gtk.Window()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
Результат:
ERROR:root:Could not find any typelib for Gtk
Traceback (most recent call last):
File “Z:\usr\local\python\2.py”, line 2, in <module>
from gi.repository import Gtk
ImportError: cannot import name ‘Gtk’
Ни в site-packages, ни в \repository ни намёка на gtk.py.
Переустанавливал 2 раза, не помогло. Спасайте!

GUI » темы ttk » Сен. 18, 2014 23:47:15

Господа, а есть ли возможность где-нибудь взять новые темы для ТТК, “посовременнее” что ли.
Список установленных:
>>> Style().theme_names()
('winnative', 'clam', 'alt', 'default', 'classic', 'xpnative')
из них самая продвинутая ‘xpnative’, она же по умолчанию. ‘winnative’ навевает воспоминания о win 3.11, остальное вообще вырвиглаз.
Неужели хотя бы модов каких-нибудь нет?
Спасибо.

Python для новичков » Установка Grab на Python 3.4 » Сен. 17, 2014 02:15:25

Здравствуйте!
Дано: Windows 8.1 x64, Python 3.4.1 (MSC v.1600 64 bit (AMD64)), Grab 0.4.13.
Предварительно установил: lxml-3.4.0.win-amd64-py3.4 и pycurl-7.19.5.win-amd64-py3.4.
При запуске установки Grab (python setup.py install) выдает содержимое аттача install.log.
Уважаемые знатоки, подскажите пожалуйста, что я делаю не так?

GUI » Помогите сделать сплитер (wxPython) » Сен. 8, 2014 06:54:12

Помогите создать окно со сплитером, на основе имеющихся примеров:

Шаблон сплитера
#!/usr/bin/python
# -*- coding: utf-8 -*-
import wx
import os
import time
ID_BUTTON=100
ID_EXIT=200
ID_SPLITTER=300
class MyListCtrl(wx.ListCtrl):
	def __init__(self, parent, id):
		wx.ListCtrl.__init__(self, parent, id, style=wx.LC_REPORT)
		#~ files = os.listdir('.')
# чётность
#~ if (j % 2) == 0:
	#~ self.SetItemBackgroundColour(j, '#e6f1f5')
#~ j = j + 1
class FileHunter(wx.Frame):
	def __init__(self, parent, id, title):
		wx.Frame.__init__(self, parent, -1, title)
		self.splitter = wx.SplitterWindow(self, ID_SPLITTER, style=wx.SP_BORDER)
		self.splitter.SetMinimumPaneSize(50)
		p1 = MyListCtrl(self.splitter, -1)
		p2 = MyListCtrl(self.splitter, -1)
		self.splitter.SplitVertically(p1, p2)
		self.Bind(wx.EVT_SIZE, self.OnSize)
		self.Bind(wx.EVT_SPLITTER_DCLICK, self.OnDoubleClick, id=ID_SPLITTER)
		self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
		self.Bind(wx.EVT_BUTTON, self.OnExit, id=ID_EXIT)
		self.sizer = wx.BoxSizer(wx.VERTICAL)
		self.sizer.Add(self.splitter,1,wx.EXPAND)
		self.sizer.Add(self.sizer2,0,wx.EXPAND)
		self.SetSizer(self.sizer)
		size = wx.DisplaySize()
		self.SetSize(size)
		#~ self.sb = self.CreateStatusBar()
		#~ self.sb.SetStatusText(os.getcwd())
		self.Center()
		self.Show(True)
	def OnExit(self,e):
		self.Close(True)
	def OnSize(self, event):
		size = self.GetSize()
		self.splitter.SetSashPosition(size.x / 2)
		#~ self.sb.SetStatusText(os.getcwd())
		event.Skip()
	def OnDoubleClick(self, event):
		size =  self.GetSize()
		self.splitter.SetSashPosition(size.x / 2)
app = wx.App(0)
FileHunter(None, -1, 'File Hunter')
app.MainLoop()

Мой GUI. Слитер нужно вертикальный между четырмя полями слева и списком справа. И если не сложно, то ещё бы горизонтальный сплитер между Edit-окнами редактирования.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import wx
class WinRegExp(wx.Frame):
	def __init__(self, parent, title):
		super(WinRegExp, self).__init__(parent, title=title, size=(640, 480))
		self.InitUI()
		self.Centre()
		self.Show()
	def InitUI(self):
		panel = wx.Panel(self)
		# font = wx.SystemSettings_GetFont(wx.SYS_SYSTEM_FONT)
		# font.SetPointSize(9)
		vbox = wx.BoxSizer(wx.VERTICAL) # Создаём вертикальный бокс
		# Создаём бокс с лейблом
		hbox1 = wx.BoxSizer(wx.HORIZONTAL) # Создаём горизонтальный бокс
		Label1 = wx.StaticText(panel, label=u'Регулярное выражение для поиска') # Создаём лейбл
		# Label1.SetFont(font) # Задаём шрифт
		hbox1.Add(Label1, flag=wx.RIGHT, border=8) # Добавляем лейбл в бокс
		vbox.Add(hbox1, flag=wx.LEFT | wx.TOP, border=10) # Добавляем бокс в вертикальный бокс с установками ресайза
		# vbox.Add(hbox1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP, border=10) # Добавляем бокс в вертикальный бокс с установками ресайза
		# Создаём бокс с полем ввода
		hbox2 = wx.BoxSizer(wx.HORIZONTAL) # Создаём 2-ой бокс
		input1 = wx.TextCtrl(panel) # Создаём поле ввода
		hbox2.Add(input1, proportion=1) # Добавляем поле ввода в бокс
		vbox.Add(hbox2, flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=10) # Добавляем бокс в вертикальный бокс с установками ресайза
		# Создаём бокс с лейблом
		hbox3 = wx.BoxSizer(wx.HORIZONTAL) # Создаём горизонтальный бокс
		Label2 = wx.StaticText(panel, label=u'Шаблон замены') # Создаём лейбл
		# Label2.SetFont(font) # Задаём шрифт
		hbox3.Add(Label2, flag=wx.RIGHT, border=8) # Добавляем лейбл в бокс
		vbox.Add(hbox3, flag=wx.LEFT | wx.TOP, border=10) # Добавляем бокс в вертикальный бокс с установками ресайза
		# Создаём бокс с полем ввода
		hbox4 = wx.BoxSizer(wx.HORIZONTAL) # Создаём 2-ой бокс
		input2 = wx.TextCtrl(panel) # Создаём поле ввода
		hbox4.Add(input2, proportion=1) # Добавляем поле ввода в бокс
		vbox.Add(hbox4, flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=10) # Добавляем бокс в вертикальный бокс с установками ресайза
		# Создаём бокс с лейблом
		hbox5 = wx.BoxSizer(wx.HORIZONTAL) # Создаём горизонтальный бокс
		Label3 = wx.StaticText(panel, label=u'Текст в котором поиск') # Создаём лейбл
		# Label3.SetFont(font) # Задаём шрифт
		hbox5.Add(Label3, flag=wx.RIGHT, border=8) # Добавляем лейбл в бокс
		vbox.Add(hbox5, flag=wx.LEFT | wx.TOP, border=10) # Добавляем бокс в вертикальный бокс с установками ресайза
		# Создаём бокс с окном редактирования
		hbox6 = wx.BoxSizer(wx.HORIZONTAL) # Создаём горизонтальный бокс
		Edit3 = wx.TextCtrl(panel, style=wx.TE_MULTILINE) # Создаём окно редактирования
		hbox6.Add(Edit3, proportion=1, flag=wx.EXPAND)
		vbox.Add(hbox6, proportion=1, flag=wx.LEFT|wx.RIGHT|wx.EXPAND, border=10)
		# Создаём бокс с лейблом
		hbox7 = wx.BoxSizer(wx.HORIZONTAL) # Создаём горизонтальный бокс
		Label4 = wx.StaticText(panel, label=u'Результат после обработки') # Создаём лейбл
		# Label4.SetFont(font) # Задаём шрифт
		hbox7.Add(Label4, flag=wx.RIGHT, border=8) # Добавляем лейбл в бокс
		vbox.Add(hbox7, flag=wx.LEFT | wx.TOP, border=10) # Добавляем бокс в вертикальный бокс с установками ресайза
		# Создаём бокс с окном редактирования
		hbox8 = wx.BoxSizer(wx.HORIZONTAL) # Создаём горизонтальный бокс
		Edit4 = wx.TextCtrl(panel, style=wx.TE_MULTILINE) # Создаём окно редактирования
		hbox8.Add(Edit4, proportion=1, flag=wx.EXPAND)
		vbox.Add(hbox8, proportion=1, flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.EXPAND, border=10)
		#~ vbox.Add((-1, 10)) # Создаём отступ
		vbox2 = wx.BoxSizer(wx.VERTICAL) # Создаём вертикальный бокс
		# Создаём бокс со списком
		hbox21 = wx.BoxSizer(wx.HORIZONTAL) # Создаём горизонтальный бокс
		listbox1 = wx.ListBox(panel, -1) # Создаём список
		hbox21.Add(listbox1, proportion=1, flag=wx.EXPAND)
		vbox2.Add(hbox21, proportion=1, flag=wx.TOP|wx.BOTTOM|wx.RIGHT|wx.EXPAND, border=10)
		# Создаём бокс с кнопкой
		hbox22 = wx.BoxSizer(wx.HORIZONTAL)
		btn1 = wx.Button(panel, label=u'Старт', size=(70, 30))
		hbox22.Add(btn1)
		#~ hbox22.Add(btn1, flag=wx.LEFT|wx.BOTTOM, border=5)
		vbox2.Add(hbox22, flag=wx.ALIGN_RIGHT|wx.RIGHT, border=10)
		mhbox = wx.BoxSizer(wx.HORIZONTAL) # Создаём горизонтальный бокс
		mhbox.Add(vbox, proportion=3, flag=wx.EXPAND, border=0)
		mhbox.Add(vbox2, proportion=1, flag=wx.EXPAND, border=0)
		#~ panel.SetSizer(vbox)
		panel.SetSizer(mhbox)
if __name__ == '__main__':
	app = wx.App()
	WinRegExp(None, title='RegExp')
	app.MainLoop()