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

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

13.06.2016, 22:14. Показов 4188. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru