Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
8 / 8 / 5
Регистрация: 19.11.2012
Сообщений: 438

PyQT для начинающего

13.06.2016, 22:14. Показов 4243. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем хаюшки, крч, почитал я в интернете про PyQT и лишний раз убедился, что клепать "ручками" GUI для меня - не подъёмное задание. Но так как диплом всё же сдать надо - в который раз прошу помощи у вас
И так, у меня есть простенький дизайн формы авторизации в Вк и модуль для самой авторизации.
Подскажите пожалуйста что, как и где писать, чтобы кнопка "Ок" авторизировала меня в Вк при помощи модуля vk_auth
Сам vk_auth
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import cookielib
import urllib2
import urllib
from urlparse import urlparse
from HTMLParser import HTMLParser
 
class FormParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.url = None
        self.params = {}
        self.in_form = False
        self.form_parsed = False
        self.method = "GET"
 
    def handle_starttag(self, tag, attrs):
        tag = tag.lower()
        if tag == "form":
            if self.form_parsed:
                raise RuntimeError("Second form on page")
            if self.in_form:
                raise RuntimeError("Already in form")
            self.in_form = True
        if not self.in_form:
            return
        attrs = dict((name.lower(), value) for name, value in attrs)
        if tag == "form":
            self.url = attrs["action"]
            if "method" in attrs:
                self.method = attrs["method"].upper()
        elif tag == "input" and "type" in attrs and "name" in attrs:
            if attrs["type"] in ["hidden", "text", "password"]:
                self.params[attrs["name"]] = attrs["value"] if "value" in attrs else ""
 
    def handle_endtag(self, tag):
        tag = tag.lower()
        if tag == "form":
            if not self.in_form:
                raise RuntimeError("Unexpected end of <form>")
            self.in_form = False
            self.form_parsed = True
 
def auth(email, password, client_id, scope):
    def split_key_value(kv_pair):
        kv = kv_pair.split("=")
        return kv[0], kv[1]
 
    # Authorization form
    def auth_user(email, password, client_id, scope, opener):
        response = opener.open(
            "http://oauth.vk.com/oauth/authorize?" + \
            "redirect_uri=http://oauth.vk.com/blank.html&response_type=token&" + \
            "client_id=%s&scope=%s&display=wap" % (client_id, ",".join(scope))
            )
        doc = response.read()
        parser = FormParser()
        parser.feed(doc)
        parser.close()
        if not parser.form_parsed or parser.url is None or "pass" not in parser.params or \
          "email" not in parser.params:
              raise RuntimeError("Something wrong")
        parser.params["email"] = email
        parser.params["pass"] = password
        if parser.method == "POST":
            response = opener.open(parser.url, urllib.urlencode(parser.params))
        else:
            raise NotImplementedError("Method '%s'" % parser.method)
        return response.read(), response.geturl()
 
    # Permission request form
    def give_access(doc, opener):
        parser = FormParser()
        parser.feed(doc)
        parser.close()
        if not parser.form_parsed or parser.url is None:
              raise RuntimeError("Something wrong")
        if parser.method == "POST":
            response = opener.open(parser.url, urllib.urlencode(parser.params))
        else:
            raise NotImplementedError("Method '%s'" % parser.method)
        return response.geturl()
 
 
    if not isinstance(scope, list):
        scope = [scope]
    opener = urllib2.build_opener(
        urllib2.HTTPCookieProcessor(cookielib.CookieJar()),
        urllib2.HTTPRedirectHandler())
    doc, url = auth_user(email, password, client_id, scope, opener)
    if urlparse(url).path != "/blank.html":
        # Need to give access to requested scope
        url = give_access(doc, opener)
    if urlparse(url).path != "/blank.html":
        raise RuntimeError("Expected success here")
    answer = dict(split_key_value(kv_pair) for kv_pair in urlparse(url).fragment.split("&"))
    if "access_token" not in answer or "user_id" not in answer:
        raise RuntimeError("Missing some values in answer")
    return answer["access_token"], answer["user_id"]

Форма авторизации:
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from PyQt4 import QtCore, QtGui
 
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s
 
try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)
 
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(339, 221)
        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QtCore.QRect(40, 150, 211, 32))
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
        self.lineEdit = QtGui.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(140, 40, 113, 27))
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.lineEdit_2 = QtGui.QLineEdit(Dialog)
        self.lineEdit_2.setGeometry(QtCore.QRect(140, 80, 113, 27))
        self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
        self.labelOne = QtGui.QLabel(Dialog)
        self.labelOne.setGeometry(QtCore.QRect(70, 40, 51, 17))
        self.labelOne.setObjectName(_fromUtf8("labelOne"))
        self.labelTwo = QtGui.QLabel(Dialog)
        self.labelTwo.setGeometry(QtCore.QRect(70, 90, 51, 17))
        self.labelTwo.setObjectName(_fromUtf8("labelTwo"))
 
        self.retranslateUi(Dialog)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
 
    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Авторизация", None))
        self.labelOne.setText(_translate("Dialog", "Логин", None))
        self.labelTwo.setText(_translate("Dialog", "Пароль", None))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2016, 22:14
Ответы с готовыми решениями:

Разница между PyQT 5 и PyQT 6
Добрый день, форумчане. Прошел тут курс всеми вами любимого автора, познакомился с GUI TKinter, и по вашим советам решил освоить PyQT. ...

Листы стилей для pyQT
Какие есть бесплатные листы стилей (stylesheets) для pyQT? Есть красивый и широко известный dark orange, а ещё?

Шаблон для использования PyQt интерфейса
Здравствуйте! Столкнулся с проблемой внедрения интерфейса в программу, а именно: Создаю интерфейс в Qt Designer, компилирую...

24
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.06.2016, 18:13
Студворк — интернет-сервис помощи студентам
Только когда его используют, то в основном не знают и не пытаются узнать. Такие вещи поощряют малограмотность в программировании gui.
1
8 / 8 / 5
Регистрация: 19.11.2012
Сообщений: 438
14.06.2016, 18:19  [ТС]
Avazart, я уже смирился и начал пробовать делать ручками, даже начал что-то понимать, но когда я пробую добавить Layout в Layout мне выдаёт ошибку :-|
Кликните здесь для просмотра всего текста

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- coding: utf-8 -*-
 
from PyQt4 import QtCore, QtGui
 
class MyWindow(QtGui.QWidget):
    def __init__ (self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.labelOne = QtGui.QLabel("Логин")
        self.labelTwo = QtGui.QLabel("Пароль")
        self.editOne = QtGui.QLineEdit()
        self.editTwo = QtGui.QLineEdit()
        self.btnEnter = QtGui.QPushButton("&Войти")          
        self.vBox = QtGui.QVBoxLayout()
        self.hBoxOne = QtGui.QHBoxLayout()
        self.hBoxTwo = QtGui.QHBoxLayout()      
        
        self.labelOne.setAlignment(QtCore.Qt.AlignCenter)
        self.labelTwo.setAlignment(QtCore.Qt.AlignCenter)       
        self.hBoxOne.addWidget(self.labelOne)
        self.hBoxOne.addWidget(self.editOne)
        self.hBoxTwo.addWidget(self.labelTwo)
        self.hBoxTwo.addWidget(self.editTwo)
        self.vBox.addWidget(self.hBoxOne)
        self.vBox.addWidget(self.hBoxTwo)
        self.vBox.addWidget(self.btnEnter)
        self.setLayout(self.vBox)
        #self.connect (self.btnQuit, QtCore.SIGNAL("clicked()"),
        #   QtGui.qApp.quit)
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    window = MyWindow() 
    window.setWindowTitle("Авторизация")
    window.resize(300, 70)
    window.show () 
    sys.exit(app.exec_())

Сама ошибка:
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mohax@android-56db543bf2e5:~$ python tested.py
Traceback (most recent call last):
  File "tested.py", line 33, in <module>
    window = MyWindow() 
  File "tested.py", line 23, in __init__
    self.vBox.addWidget(self.hBoxOne)
TypeError: QBoxLayout.addWidget(QWidget, int stretch=0, Qt.Alignment alignment=0): argument 1 has unexpected type 'QHBoxLayout'
mohax@android-56db543bf2e5:~$ python3 tested.py
Traceback (most recent call last):
  File "tested.py", line 33, in <module>
    window = MyWindow() 
  File "tested.py", line 23, in __init__
    self.vBox.addWidget(self.hBoxOne)
TypeError: QBoxLayout.addWidget(QWidget, int stretch=0, Qt.Alignment alignment=0): argument 1 has unexpected type 'QHBoxLayout'
mohax@android-56db543bf2e5:~$
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.06.2016, 20:02
qozyrek, нельзя layout в layout пихать потому, что. Покажи как ты хочешь, чтобы выглядело окно, я тебе помогу.
1
8 / 8 / 5
Регистрация: 19.11.2012
Сообщений: 438
14.06.2016, 20:07  [ТС]
alex925, нужно два окна.
Миниатюры
PyQT для начинающего   PyQT для начинающего  
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.06.2016, 20:35
Цитата Сообщение от alex925 Посмотреть сообщение
qozyrek, нельзя layout в layout пихать потому, что.
Можно.

qozyrek, Для добавления виджетов один метод для лейаутов другой читай документацию:

addItem()
http://doc.qt.io/qt-5/qlayout.html

И еще MainWindow должен быть один в приложении, остальные окна лучше создавать на основе QDialog или QWidget
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.06.2016, 20:35

Как установить pyqt для python 3.6
Есть ли какие то сборки, чтобы не надо было морочиться с настройками и поиском подходящих версий?

IDE для программирования на C для начинающего под Windows.
Посоветуйте программу для программирования на си для начинающего для windows.

C++ для начинающего!
Добрый день! Вопрос местным знатокам и гуру. Есть желание начать программировать на C++. Проблема в том, что не знаю, с чего начать. Книг...

Для начинающего
Я полный новичок в программировании для Android. Подскажите мне с чего начать? Какую литературу читать? Мне нужно программировать ПО для...

Для начинающего
Я недавно начал работать в VBA и не работал в Basic вообще поэтому не могли бы вы мне сказать код что бы присвоить значение одной ячейки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru