Đề tài này đại diện cho nỗ lực của nhóm 9 trong việc tạo ra một ứng dụng dự báo thời tiết dễ sử dụng và hiệu quả, với sự tập trung vào việc cung cấp thông tin thời tiết chính xác và tiện
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN
-BÁO CÁO BÀI TẬP LỚN
Môn: Lập trình với Python
Đề tài: Tạo ứng dụng dự báo thời tiết đơn giản
Nhóm lớp: 05
Nhóm bài tập 09
Thành viên nhóm Mã sinh viên Công việc
Phạm Viết Tài
Anh
B21DCCN012 Lập trình và tổng hợp
Đỗ Công Bắc B21DCCN168 Lập trình
Dương Thế Anh B21DCCN144 Báo cáo và Slide Nguyễn Bá Anh B21DCCN150 Lập trình và thuyết trình
Giảng viên hướng dẫn: Vũ Minh Mạnh
Hà Nội 2023
Trang 2MỤC LỤC
Chương I Giới thiệu 2
1 Giới thiệu 2
2 Lý do thực hiện đề tài 2
3 Mục tiêu thực hiện và phạm vi đề tài 2
Chương II Nội dung 4
2.1 Khái quát 4
2.1.1 Ứng dụng là gì? 4
2.1.2 Lợi ích 4
2.2 Triển khai 5
2.2.1 Thư viện và API cần thiết 5
2.2.2 Khởi tạo 7
2.2.3 Thiết kế 9
2.2.3 Chạy ứng dụng 17
2.3 Kết quả 18
Chương III Kết luận 19
3.1 Kết luận đề tài 19
3.2 Hướng phát triển trong tương lai 19
Chương IV Tài liệu tham khảo 20
Trang 3Chương I Giới thiệu
1 Giới thiệu
Báo cáo này là kết quả của quá trình tìm hiểu, học hỏi và phát triển
để triển khai đề tài “Ứng dụng Dự báo thời tiết đơn giản” Đề tài này đại diện cho nỗ lực của nhóm 9 trong việc tạo ra một ứng dụng dự báo thời tiết
dễ sử dụng và hiệu quả, với sự tập trung vào việc cung cấp thông tin thời tiết chính xác và tiện lợi cho người dùng
Báo cáo sẽ xoay quanh quá trình thu thập thông tin của từng phần cấu thành để xây dựng nên ứng dụng hoàn trình mà nhóm 9 đã thưc hiện Chúng em hi vọng rằng báo cáo này sẽ truyền đạt được sự nỗ lực và đóng góp của cả nhóm trong việc xây dựng ứng dụng dự báo thời tiết đơn giản này và giúp mọi người hiểu rõ về quá trình phát triển ứng dụng di động
2 Lý do thực hiện đề tài
Thời tiết luôn đóng một vai trò quan trọng trong cuộc sống hàng ngày của chúng ta Nó quyết định những quyết định đơn giản như chúng ta
có nên mang theo áo mưa khi ra khỏi nhà hay không, hoặc có thể ảnh hưởng đến kế hoạch của chúng ta trong cả ngày Với sự phát triển của công nghệ và điện thoại di động, việc truy cập thông tin thời tiết đã trở nên dễ dàng hơn bao giờ hết Đó là lý do tại sao chúng em quyết định thực hiện dự
án "Ứng dụng dự báo thời tiết đơn giản" Ứng dụng này là một phần của sự học hỏi và phát triển cá nhân của chúng em Nó không chỉ đòi hỏi kiến thức
kỹ thuật mà còn là cơ hội để thử thách trong việc quản lý dự án và xây dựng một ứng dụng từ đầu đến cuối Trong báo cáo này, nhóm em sẽ chia
sẻ với thầy quá trình triển khai "Ứng dụng dự báo thời tiết đơn giản" Tuy rằng ứng dụng vẫn chưa được tối ưu về cả giao diện và hiện năng, song hy vọng rằng ứng dụng này sẽ trở thành một công cụ hữu ích cho người dùng
để theo dõi thông tin thời tiết và đồng thời cũng là một ví dụ về sự đam mê
và học hỏi trong lĩnh vực công nghệ
3 Mục tiêu thực hiện và phạm vi đề tài
Mục tiêu của dự án "Ứng dụng Dự báo Thời tiết Đơn giản" của chúng em
là xây dựng và triển khai một ứng dụng dự báo thời tiết đơn giản, dễ sử
Trang 4dụng, và hiệu quả Chúng em đặt ra các mục tiêu cùng với khả năng cụ thể của đề tài như sau:
1 Cung cấp thông tin thời tiết chính xác: Chúng em phát triển hệ thống lấy dữ liệu thời tiết từ nguồn tin cậy và cam kết cung cấp thông tin thời tiết chính xác cho người dùng, giúp họ có thể tin tưởng vào dự báo thời tiết từ ứng dụng của chúng em
2 Tích hợp với tác tính năng tiện ích: Chúng em tạo ra giao diện người dùng dễ sử dụng, cho phép người dùng tìm kiếm thông tin thời tiết cho các địa điểm cụ thể và hiển thị thông tin theo cách dễ hiểu Đồng thời, chúng em cung cấp tính năng như dự báo thời tiết trong tương lai, và hiển thị biểu đồ thời tiết
3 Sự Đơn giản và Tiện lợi: Chúng em tạo ra một giao diện người dùng đơn giản, dễ sử dụng, và thân thiện với người dùng Mục tiêu là làm cho việc kiểm tra thông tin thời tiết trở nên tiện lợi và nhanh chóng cho mọi người
4 Học hỏi và Phát triển: Dự án này cũng là cơ hội cho chúng em học hỏi và phát triển kỹ năng trong lĩnh vực phát triển ứng dụng, quản lý dự án,
và làm việc với dịch vụ web và API
Trang 5Chương II Nội dung
2.1 Khái quát
2.1.1 Ứng dụng là gì?
Một ứng dụng (Application, viết tắt là "app") là một phần mềm hoặc chương trình máy tính được phát triển để thực hiện một loạt nhiệm vụ hoặc chức năng cụ thể trên một thiết bị điện tử, chẳng hạn như máy tính, điện thoại di động, máy tính bảng, hoặc các thiết bị thông minh khác Ứng dụng
có thể có nhiều mục tiêu và cung cấp cho người dùng các dịch vụ và tính năng khác nhau
2.1.2 Lợi ích
Dưới đây là một số lợi ích chính của việc sử dụng ứng dụng:
1 Tiện lợi: Ứng dụng mang lại sự tiện lợi cho người dùng bằng cách cho phép họ truy cập vào các dịch vụ và thông tin ngay lập tức thông qua giao diện đồ họa dễ sử dụng Người dùng có thể sử dụng ứng dụng trên các thiết bị di động, laptop, hoặc máy tính bảng mọi lúc, mọi nơi
2 Tích hợp và tương tác: Ứng dụng có thể tương tác với các tính năng và thiết bị khác trên thiết bị của người dùng Ví dụ, ứng dụng có thể
sử dụng máy ảnh, cảm biến gia tốc, GPS, v.v., để cung cấp các tính năng đa dạng
3 Tùy chỉnh: Người dùng có thể tùy chỉnh ứng dụng theo nhu cầu của họ, cho phép họ chọn các tùy chọn và cài đặt phù hợp với sở thích cá nhân
4 Trải nghiệm người dùng tốt: Ứng dụng thường được thiết kế với giao diện người dùng (UI) và trải nghiệm người dùng (UX) chuyên nghiệp
để đảm bảo sự dễ sử dụng và thú vị cho người dùng
5 Tích hợp mạng và dữ liệu thời gian thực: Nhiều ứng dụng có khả năng truy cập và chia sẻ dữ liệu thời gian thực thông qua kết nối internet Điều này cho phép ứng dụng cung cấp thông tin mới nhất và cập nhật liên tục
6 Tạo giá trị thương mại: Ứng dụng có thể được sử dụng để tạo giá trị thương mại, ví dụ như ứng dụng thương mại điện tử, dịch vụ trực tuyến,
và nhiều loại ứng dụng khác có thể tạo ra thu nhập hoặc lợi ích kinh tế
7 Giải quyết vấn đề và cung cấp giải pháp: Nhiều ứng dụng được thiết kế để giải quyết các vấn đề cụ thể hoặc cung cấp giải pháp cho người
Trang 6dùng Ví dụ, ứng dụng thời tiết có thể giúp người dùng dự đoán thời tiết trong tương lai
Trên tất cả, ứng dụng là một phần quan trọng của cuộc sống hiện đại, giúp người dùng tận dụng tốt nhất tiện ích và tính năng của thiết bị điện tử của họ để làm việc, giải trí, và tương tác với thế giới xung quanh
2.2 Triển khai
2.2.1 Thư viện và API cần thiết
- Để xây dựng nên ứng dụng, chúng em đã tìm hiểu và sử dụng các thư viện và API để lấy dữ liệu như sau:
1 Tkinter: Tkinter là thư viện Python tiêu chuẩn cho giao diện người dùng đồ họa (GUI) Chúng em đã sử dụng Tkinter để tạo giao diện người dùng cho ứng dụng và tạo các tiện ích như cửa sổ, hộp văn bản và nút
2 PIL (Python Imaging Library): PIL là một thư viện cho phép làm việc với hình ảnh.Chúng em đã sử dụng nó để hiển thị biểu tượng thời tiết trong giao diện người dùng
3 Geopy: Thư viện Geopy được sử dụng để tìm vị trí (tọa độ) của thành phố hoặc địa điểm dựa trên tên của nó Điều này có thể hữu ích để lấy thông tin về thời tiết cho vị trí cụ thể
4 Timezonefinder: Thư viện Timezonefinder giúp xác định múi giờ của
vị trí cụ thể dựa trên tọa độ Điều này cần thiết để hiển thị thời gian cục bộ và địa phương trong ứng dụng
5 Pytz: Thư viện Pytz giúp làm việc với múi giờ và thời gian trong Python Bạn đã sử dụng nó để tính toán thời gian cục bộ cho vị trí được chọn
6 Requests: Thư viện Requests được sử dụng để thực hiện các yêu cầu HTTP đến API dự báo thời tiết Chúng em đã sử dụng nó để tải dữ liệu thời tiết từ một dịch vụ dự báo thời tiết bên ngoài
Trang 77 OpenWeatherMap API: Nhóm em đã sử dụng API của
OpenWeatherMap để lấy thông tin thời tiết cho vị trí được chọn API này đã được sử dụng để lấy thông tin về nhiệt độ, độ ẩm, áp suất, tốc
độ gió và nhiều thông tin thời tiết khác
8 OpenStreetMap: sử dụng API này để lấy tọa độ chính xác
Sau đó chúng em đã sử dụng lệnh “pip install” trong giao diện Terminal của VSCode để cài đặt các thư viện:
Chúng em tiếp tục thu thập và tải những hình ảnh và icon sử dụng trong đề tài:
Hình nền và khung
Các icon tượng trưng cho thời tiết
Trang 82.2.2 Khởi tạo
1 Xây dựng giao diện và thông số của ứng dụng
- Khai báo các thư viện cần thiết:
2 Tạo cửa sổ hiển thị và hộp tìm kiếm:
Trang 9- Tạo một cửa sổ giao diện với tiêu đề “Weather app” và kích thước 1000x600 pixel, hiển thị ở vị trí (300,100) trên màn hình
- Sử dung hình ảnh “pexels-aaron-burden-249543.jpg” để làm hình nên cho ứng dụng và thêm nó vào cửa sổ giao diện
- Dùng ảnh “logo.png” để làm icon của ứng dụng.
- Search_image: Đây là hình ảnh dùng để tạo nút tìm kiếm Hình ảnh được đọc từ tệp "Rounded Rectangle 3.png" và lưu vào biến `Search_image` bằng cách sử dụng `PhotoImage`
Trang 10- myimage: Một nhãn (Label) được tạo để hiển thị hình ảnh
`Search_image` làm nền của nút tìm kiếm
- weat_image: Tương tự như trên, hình ảnh được đọc từ tệp "Layer 7.png"
và lưu vào biến `weat_image` bằng cách sử dụng `PhotoImage`
- weatherimage: Một nhãn khác được tạo để hiển thị hình ảnh
`weat_image` làm nền cho biểu tượng thời tiết
- textfield: Đây là một trường văn bản (`Entry`) để người dùng có thể nhập địa điểm
- textfield.focus(): Đoạn mã này thiết lập trường văn bản `textfield` trở thành phần ghi chú tùy chỉnh, tức là người dùng có thể bắt đầu nhập ngay lập tức khi ứng dụng được mở
-command=getWeather`: Khi nút được nhấn, hàm `getWeather` sẽ được gọi
để tìm thông tin thời tiết dựa trên địa điểm người dùng nhập vào
2.2.3 Thiết kế
1 Khởi tao hàm getWeather(), đây là hàm xử lý lấy dữ liệu thời tiết từ API dựa trên địa điểm mà người dung nhập vào
2 API
Phần mã này thực hiện việc gửi yêu cầu API để lấy thông tin thời tiết cho một thành phố được nhập:
- Lấy thông tin vị trí và múi giờ: Đầu tiên, mã lấy tên thành phố từ trường văn bản `textfield`, mà người dùng đã nhập để tìm kiếm thời tiết cho thành phố đó Sau đó, nó sử dụng thư viện Geopy để tạo một đối tượng
`geolocator` và sử dụng nó để tìm kiếm thông tin vị trí của thành phố Một đối tượng `TimezoneFinder` được tạo để tìm múi giờ tại vị trí này, và múi giờ được cập nhật lên nhãn `timezone`
Trang 11- Hiển thị tọa độ địa lý: Tọa độ địa lý (latitude và longitude) của thành phố được hiển thị trên nhãn `long_fat` với định dạng "xx°N, xx°E."
- Lấy múi giờ và thời gian hiện tại: Múi giờ được sử dụng để tạo đối tượng múi giờ (`home`) và lấy thời gian hiện tại ở múi giờ đó Thời gian hiện tại được định dạng theo 12 giờ và hiển thị trên nhãn `clock`
- Lấy dữ liệu thời tiết từ API: Mã tạo một URL API bằng cách sử dụng tọa
độ địa lý của thành phố (latitude và longitude) và gửi yêu cầu API để lấy dữ liệu thời tiết Dữ liệu JSON từ API được lấy bằng cách sử dụng thư viện
`requests`, sau đó được giải mã thành một biến `json_data`
- Lấy thông tin thời tiết hiện tại: Mã trích xuất thông tin về thời tiết hiện tại
từ biến `json_data`, bao gồm nhiệt độ (`temp`), độ ẩm (`humidity`), áp suất (`pressure`), tốc độ gió (`wind`), và mô tả thời tiết (`description`)
2 Tạo ô hiển thị các thông số nhiệt độ, độ ẩm, áp suất, tốc độ gió, thời tiết:
- iga: Mở một hình ảnh từ tệp "Rounded Rectangle 1.png" bằng cách sử dụng `Image.open` và lưu vào biến `iga`
- resize1: Sau đó, hình ảnh `iga` được thay đổi kích thước bằng phương thức `resize` để có kích thước mới là (300, 160) pixels Kết quả sau khi thay đổi kích thước được lưu trong biến `resize1`
Trang 12- Round_box: Biến `Round_box` chứa hình ảnh đã được thay đổi kích thước trong định dạng `ImageTk.PhotoImage`, làm cho nó có thể sử dụng trong giao diện đồ họa của tkinter
- Label(root, image=Round_box, bg="#203243").place(x=330, y=70): Đoạn mã này tạo một nhãn (Label) trong giao diện đồ họa của tkinter Hình ảnh `Round_box` sẽ làm nền cho nhãn này Nhãn này có màu nền là
"#203243" và được đặt tại vị trí `(x=330, y=70)` trên cửa sổ giao diện
- label1, label2, label3, label4, label5: Đây là năm nhãn (Label) khác được tạo ra để hiển thị các thông tin cụ thể về thời tiết Mỗi nhãn đại diện cho một thông tin cụ thể, bao gồm "Nhiệt độ", "Độ ẩm", "Áp suất", "Tốc độ gió" và "Thời tiết" Các nhãn này có các thuộc tính như màu chữ, kích thước và vị trí cụ thể trên giao diện
- Nhãn n sẽ hiển thị nhiêt độ, d hiển thị độ ẩm, a hiển thị áp suất, t hiển thị tốc độ gió và t1 hiển thị mô tả thời tiết hiện tại
Đơn vị của thông số
3 Hiển thị múi giờ và tọa độ địa lý:
Trang 134 Khung hiển thị thông tin cho các ngày:
Tạo 7 khung, trong đó:
- firstframe: Đây là khung đầu tiên để hiển thị thông tin cho ngày đầu tiên Trong khung "firstframe," có các nhãn sau:
- day1: Nhãn để hiển thị tên của ngày (vd: Thứ Hai, Thứ Ba, )
- `font="arial 20"`: Đặt kiểu font và kích thước cho văn bản
Trang 14- `bg="#282829"`: Đặt màu nền của nhãn là "#282829".
- `fg="#fff"`: Đặt màu chữ là trắng
- `place(x=100, y=5)`: Đặt vị trí của nhãn trên khung tại tọa độ (100, 5)
- firstimage: Nhãn để hiển thị biểu tượng thời tiết cho ngày đầu tiên
- `bg="#282829"`: Đặt màu nền của nhãn là "#282829"
- `place(x=1, y=15)`: Đặt vị trí của nhãn trên khung tại tọa độ (1, 15)
- temp1: Nhãn để hiển thị thông tin về nhiệt độ cho ngày đầu tiên
- `bg="#282829"`: Đặt màu nền của nhãn là "#282829"
- `fg="#57adff"`: Đặt màu chữ là xanh dương
- `font="arial 15 bold"`: Đặt kiểu font và kích thước cho văn bản
- `place(x=100, y=50)`: Đặt vị trí của nhãn trên khung tại tọa độ (100, 50)
- secondframe, thirdframe, , seventhframe: Tạo các khung tương tự như
"firstframe" để hiển thị thông tin cho các ngày tiếp theo trong tuần Mỗi khung có các thuộc tính tương tự như "firstframe," chỉ có sự khác biệt trong
vị trí tọa độ
- day2, day3, , day7: Nhãn trong từng khung để hiển thị tên của ngày tương ứng
- secondimage, thirdimage, , seventhimage: Nhãn trong từng khung để hiển thị biểu tượng thời tiết cho ngày tương ứng
- temp2, temp3, , temp7: Nhãn trong từng khung để hiển thị thông tin
về nhiệt độ cho ngày tương ứng
5 Tạo ô đề xuất:
Trang 15Khung đề xuất và thông số đính kèm
Các chỉ số của đề xuất
Trang 16Tạo một loạt các nhãn và hình ảnh trong các phần (`lab1`, `lab2`, `lab3`, và
`lab4`) trên giao diện của ứng dụng để hiển thị thông tin về thời tiết và các chỉ số khác
**lab1**:
- `textlab1`: Nhãn văn bản hiển thị "Thời tiết" với font chữ "black" kích thước 10, đặt vị trí tại `(x=50, y=10)`
- `imagelab1`: Nhãn hình ảnh để hiển thị biểu tượng thời tiết Nền của nhãn này là màu đen
- `tblab1`: Nhãn văn bản để hiển thị thông tin về thời tiết Màu nền là trắng, màu chữ là đen
**lab2**:
- `textlab2`: Nhãn văn bản hiển thị "Sốc nhiệt" với font chữ "black" kích thước 10, đặt vị trí tại `(x=50, y=10)`
- `imagelab2`: Nhãn hình ảnh để hiển thị biểu tượng sốc nhiệt Nền của nhãn này là màu đen
- `tblab2`: Nhãn văn bản để hiển thị thông tin về sốc nhiệt Màu nền là trắng, màu chữ là đen
**lab3**:
- `textlab3`: Nhãn văn bản hiển thị "Độ ẩm" với font chữ "black" kích thước 10, đặt vị trí tại `(x=50, y=10)`
- `imagelab3`: Nhãn hình ảnh để hiển thị biểu tượng độ ẩm Nền của nhãn này là màu đen
- `tblab3`: Nhãn văn bản để hiển thị thông tin về độ ẩm Màu nền là trắng, màu chữ là đen
**lab4**:
- `textlab4`: Nhãn văn bản hiển thị "Chỉ số UV" với font chữ "black" kích thước 10, đặt vị trí tại `(x=50, y=10)`
- `imagelab4`: Nhãn hình ảnh để hiển thị biểu tượng chỉ số UV Nền của nhãn này là màu đen
- `tblab4`: Nhãn văn bản để hiển thị thông tin về chỉ số UV Màu nền là trắng, màu chữ là đen