Проект "Довідник країн" (створення інтерфейсу в коді: вкладки та таблиця)

Проект дозволяє вивести у фому інформацію про країни із файлу з такою структурою: назва, столиця, грошова одиниця, площа, населення, файл із прапором.

Україна , Київ , Гривня , 603.7 , 49.1 , Ukraine.gif
США , Вашингтон , Долар , 9363.2 , 237.8 , United States.gif
Франція , Париж , Євро , 551.6 , 53.1 , France.gif
Росія , Москва , Рубль , 17075.4 , 163.7 , Russia.gif
Англія , Лондон , Фунт , 244.1 , 55.9 , United Kingdom.gif
Китай , Пекін , Юань , 9597 , 1488.5 , China.gif


Для початку потрібно зчитати дані з файлу в програму. Очевидно, що слід зберігати інформацію про кожну країну в єдиній структурній одиниці, і таких об'єктів буде кілька (з однаковою структурою).

Наприклад, всі дані про країну будуть збережені у вигляді списку: ['Україна', 'Київ', 'Гривня', '603.7', '49.1', 'Ukraine.gif']. Кілька таких списків утворюють список countries. По суті - це список списківдвовимірний список, або таблиця, у рядках якої міститься інформація про відповідні країни. 

file=open('countries.txt') #відкривання файлу

countries=[] #створення списку

for line in file: #для кожного рядка файлу

    countries.append(line.split(' , ')) #line.split(' , ') створює список з даними про країну, і додаємо цей список до загальної бази


Далі потрібно виокремити список країн, він знадобиться для формування вкладок у вікні:

choices=[] #список країн для формування меню

for elements in countries: #для елемента загального списку countries

    choices.append(elements[0]) #дописуємо в choices перший параметр елемента - назву країни


Форму для цього проекту будемо створювати у коді, а не у дизайнері PyQt Designer.

Імпорт необхідних модулів

import sys

from PyQt4 import QtCore, QtGui, uic

from PyQt4.QtGui import *            


class MyWindowClass(QtGui.QMainWindow):     #зверніть увагу, тут відсутній файл з інтерфейсом .ui

    def __init__(self, parent=None):

        QtGui.QMainWindow.__init__(self, parent) #створення вікна

        self.resize(570, 320) #розміри вікна


Код основної програми залишається без змін:

app = QtGui.QApplication(sys.argv)

myWindow = MyWindowClass(None)

myWindow.show()

app.exec_()


В опис класу вікна, після створення вікна, потрібно додати елемент, що називається вкладки QTabWidget. Це має бути глобальний об'єкт, бо до нього потрібен доступ з інших методів класу.

        global tabs

        tabs=QtGui.QTabWidget(self) #створення вкладок

        for element in choices: #для кожної країни

            tab1 = QtGui.QWidget() #створюємо власну вкладку

            tabs.addTab(tab1,element) #додаємо її до елемента форми

        tabs.resize(550, 300) #розмір вкладок

        tabs.move(10, 10) #переміщення об'єкту (створення полів)

        tabs.show() #показ об'єкту


Коли обирається (currentChanged) одна із вкладок, має виконуватись дія, описана методом tab_changed:

        tabs.currentChanged.connect(self.tab_changed)


Цей метод полягає у тому, що залежно від обраної вкладки, повертається її порядковий номер:

    def tab_changed(self):  

        n=tabs.currentIndex()


За цим номером можна показати інформацію про країну. Це означає, що створюється елемент таблиця QTableWidget для показу даних, структурованих у таблицю, та напис для виведення зображення відповідного прапора.

    def pokaz(self,n):

        table = QtGui.QTableWidget(tabs.widget(n)) #створення таблиці у вкладці з поточним номером

        table.setRowCount(4) #кількість рядків таблиці

        table.setColumnCount(2) #кількість стовпців таблиці

        ryadky=['Столиця','Валюта','Площа','Населення'] #назви рядків даних

        for i in range(4):

            table.setItem(i,0, QtGui.QTableWidgetItem(ryadky[i]))  #запис даних у перший стовпець (назви рядків даних)

            table.setItem(i,1, QtGui.QTableWidgetItem(countries[n][i+1].strip())) #запис даних у другий стовпець (дані про країни)

        table.show() #показ таблиці

        pixmap = QPixmap(countries[n][5].strip() ) #завантаження зображення з файлу

        label=QtGui.QLabel(tabs.widget(n)) #створення напису у вкладці з поточним номером

        label.setPixmap(pixmap) #завантаження зображення у напис

        label.move(300, 0) #переміщення напису

        label.resize(200,200) #розміри напису

        label.setScaledContents(True); #масштабування вмісту

        label.show() #показ напису


Виклик методу pokaz потрібно додати до початкового опису вікна:

self.pokaz(0)

А також до методу зміни вкладки:

self.pokaz(n)

Остання зміна: п'ятниця 11 травня 2018 12:59