Python桌面应用之XX学院水卡报表查询系统(Tkinter+cx_Oracle)

一、功能样式

Python桌面应用之XX学院水卡报表查询系统功能:

连接Oracle数据库,查询XX学院水卡操作总明细报表,汇总数据报表,个人明细报表,进行预览并且支持导出报表

1.总明细报表样式
明细
2.汇总明细样式
汇总明细

3.个人明细样式
个人明细
4.导出报表样式
导出
5.错误提示样式
tip
tip2

二、核心点

1. 安装cx_Oracle:使用cx_Oracle三方库连接Oracle,该库使用的python版本略低,可以在[https://cx-oracle.readthedocs.io/en/latest/](https://cx-oracle.readthedocs.io/en/latest/进行查询,安装前先确定:python版本、Orale客户端版本(要不都是64位,要不都是32位),安装cx_Oracle的版本位数是跟python的位数相关的。
使用代码进行测试

import cx_Oracle
# 账户  密码  ip:1521/实例名
conn = cx_Oracle.connect('system','Yxq123456','127.0.0.1:1521/ecard'
# 挂载数据库连接游标
self.cursor = conn.cursor()
print('连接数据库成功!')

2. 多参数查询Sql: sql语句使用:参数名来定义参数,多参数使用cursor.execute(sql,(参数1,参数2)).fetchall()来查询

sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
preopdt=self.pretimeInput.get()
nextopdt=self.nexttimeInput.get()
data = self.cursor.execute(sql,(preopdt,nextopdt)).fetchall()

**3. Treeview表格组件的使用:**这里使用了三个报表,其实可以将打开的Treeview做成一个表格class类,要使用的时候直接生成要使用的对象,传入该对象的大小,heading标题,data数据即可。

# 明细查询
    def Consumedetail(self):
        self.consumedetail = tk.Tk()
        self.consumedetail.title('XX学院明细查询')
        self.consumedetail.geometry("1000x600")
        # 加载滚动条
        scrollBar = tk.Scrollbar(self.consumedetail)
        scrollBar.pack(side = tk.RIGHT,fill = tk.Y)
        self.tree = ttk.Treeview(self.consumedetail, columns=('outid', 'name', 'opfare', 'opdt','dscrp'), show="headings", displaycolumns="#all",yscrollcommand = scrollBar.set)
        self.tree.pack()
        self.tree.heading('outid', text="学号", anchor=tk.W)
        self.tree.heading('name', text="姓名", anchor=tk.W)
        self.tree.heading('opfare', text="交易金额", anchor=tk.W)
        self.tree.heading('opdt', text="交易日期", anchor=tk.W)
        self.tree.heading('dscrp', text="交易类型", anchor=tk.W)
        # 设置关联
        scrollBar.config(command = self.tree.yview)
        # 每次打开清空页面
        for item in self.tree.get_children():
            self.consumedetail.tree.delete(item)
        sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
        preopdt=self.pretimeInput.get()
        nextopdt=self.nexttimeInput.get()
        data = self.cursor.execute(sql,(preopdt,nextopdt)).fetchall()
        # print(data)
        # data = [['2013090101','张三','100','2023-10-19','PC存款']]
        for itm in data:
            self.tree.insert("",tk.END,values=itm)
            self.tree.pack(padx=10,pady=10, fill=tk.BOTH,expand=1)
        exportbtn = tk.Button(self.consumedetail,text='导出',width=8,command=self.export).pack()

4. 导出数据自定义文件名:报表里面导出数据,其实使用遍历treeview组件数据,在进行整理后写入csv文件,自定义文件名是使用filedialog.asksaveasfilename来打开文件框,里面的文件类型使用参数filetypes ,输入文件名后获取名称生成文件。这里导出的文件就只是csv文件,如果需要其他文件类型,可以自行导入其他三方库。

     def export(self):
        # 导出export        
         # 打开文件夹选择对话框
        
        # 更新标签文本
        # print(folder_path)
        list = []
        columns = []
        # 获取表格内容id
        for row_id in self.tree.get_children():
            list.append(self.tree.item(row_id)['values'])
        print(len(self.tree.get_children()))   
        # 通过第一行获取列数生成标题
        # print(self.tree.item)
        if len(self.tree.get_children()) != 0:
            print('ok')
            folder_path = filedialog.asksaveasfilename(title='请选择一个文件',filetypes=[("CSV", ".csv")]) 
            for i in range(0,len(self.tree.item('I001')['values'])):
                columns.append(self.tree.heading(column=i)['text'])
        # 导出csv
            with open(f'{folder_path}.csv','w',newline='') as csvfile:
                fieldnames = columns
                writer = csv.writer(csvfile)
                writer.writerow(fieldnames)
                writer.writerows(list)
        else:
            messagebox.showwarning("提示", "没有数据,无法导出")
            return

5.遍历Treeview表格数据与标题:获取Treeview里面的数据与标题,这里现获取id值,然后通过item获取[‘values’]值,获取标题这里先遍历了第一行有多少数据,然后使用self.tree.heading(column=i)['text']来获取标题。

 # 获取表格内容id
for row_id in self.tree.get_children():
    list.append(self.tree.item(row_id)['values'])
 # 通过第一行获取列数生成标题
for i in range(0,len(self.tree.item('I001')['values'])):
    columns.append(self.tree.heading(column=i)['text'])

三、完整代码

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import cx_Oracle
import time
import csv
from tkinter import filedialog

# mainapp
class mainApp(object):
    def __init__(self,parent,**kwargs):
        self.root = parent
        current_timestamp = time.time()
         # 将时间戳转换为本地时间的struct_time对象
        local_time = time.localtime(current_timestamp)
         # 使用strftime()方法将struct_time对象格式化为指定的时间字符串  
        # 挂在self时间
        self.pretime = time.strftime("%Y-%m-%d 00:00:00", local_time)
        self.nexttime = time.strftime("%Y-%m-%d %H:%M:%S", local_time)

        conn = cx_Oracle.connect('system','Yxq123456','127.0.0.1:1521/ecard')
        # conn = cx_Oracle.connect('ccense','XCXY123*','127.0.0.1:1521/ecard')
        # 挂载数据库连接游标
        self.cursor = conn.cursor()
        print('连接数据库成功!')

        self.root.config(**kwargs)
        self.root.title('XX学院')
        self.root.resizable(False, False)
        self.create_widgets()
        # 获取屏幕尺寸
        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()

        # 确定窗口位置,并设置大小
        x_coordinate = (screen_width / 2) - 300 # 300是窗口的宽度
        y_coordinate = (screen_height / 2) - 200 # 200是窗口的高度
        self.root.geometry('650x400+{}+{}'.format(int(x_coordinate), int(y_coordinate)))
        # self.root.geometry("600x400")
        
    # 创建UI
    def create_widgets(self):
        self.titleLab = tk.Label(self.root,text='XX学院水卡报表管理系统',font=("kaiti",18)).place(x=190,y=30)
        self.outidLab = tk.Label(self.root,text='学号:').place(x=80,y=100)
        self.outidInput = tk.Entry(self.root, width=20)
        self.outidInput.place(x=130,y=100)
        # 姓名
        # 学号
        self.nameLab = tk.Label(self.root,text='姓名:').place(x=380,y=100)
        self.nameInput = tk.Entry(self.root,width=20)
        self.nameInput.place(x=430,y=100)
        # 起始时间
        self.mustLabel1 = tk.Label(self.root,text='*',font=('Arial', 16),fg = 'red').place(x=45,y=160)

        self.pretimeLab = tk.Label(self.root,text='起始时间:').place(x=55,y=160)
        self.pretimeInput = tk.Entry(self.root, width=20)
        self.pretimeInput.place(x=130,y=160)
        self.pretimeInput.insert(0,self.pretime)
        # 终始时间
        self.mustLabel2 = tk.Label(self.root,text='*',font=('Arial', 16),fg = 'red').place(x=350,y=160)
        
        self.nexttimeLab = tk.Label(self.root,text='终止时间:').place(x=360,y=160)
        self.nexttimeInput = tk.Entry(self.root,width=20)
        self.nexttimeInput.place(x=430,y=160)
        self.nexttimeInput.insert(0,self.nexttime)
        self.consumeBtn = tk.Button(self.root,text='明细查询',command=self.Consumedetail,width=10).place(x=130,y=260)
        self.sumBtn = tk.Button(root,text='汇总查询',command=self.sumDetail,width=10).place(x=300,y=260)
        self.personBtn = tk.Button(root,text='个人查询',command=self.personDetail,width=10).place(x=480,y=260)

        

    # 明细查询
    def Consumedetail(self):
        self.consumedetail = tk.Tk()
        self.consumedetail.title('XX学院明细查询')
        self.consumedetail.geometry("1000x600")
    
        # 加载滚动条
        scrollBar = tk.Scrollbar(self.consumedetail)
        scrollBar.pack(side = tk.RIGHT,fill = tk.Y)
        self.tree = ttk.Treeview(self.consumedetail, columns=('outid', 'name', 'opfare', 'opdt','dscrp'), show="headings", displaycolumns="#all",yscrollcommand = scrollBar.set)
        self.tree.pack()
        self.tree.heading('outid', text="学号", anchor=tk.W)
        self.tree.heading('name', text="姓名", anchor=tk.W)
        self.tree.heading('opfare', text="交易金额", anchor=tk.W)
        self.tree.heading('opdt', text="交易日期", anchor=tk.W)
        self.tree.heading('dscrp', text="交易类型", anchor=tk.W)
        # 设置关联
        scrollBar.config(command = self.tree.yview)
        # 每次打开清空页面
        for item in self.tree.get_children():
            self.consumedetail.tree.delete(item)
        sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
        preopdt=self.pretimeInput.get()
        nextopdt=self.nexttimeInput.get()
        data = self.cursor.execute(sql,(preopdt,nextopdt)).fetchall()
        # print(data)
        # data = [['2013090101','张三','100','2023-10-19','PC存款']]
        for itm in data:
            self.tree.insert("",tk.END,values=itm)
            self.tree.pack(padx=10,pady=10, fill=tk.BOTH,expand=1)
        exportbtn = tk.Button(self.consumedetail,text='导出',width=8,command=self.export).pack()

    # 汇总查询
    def sumDetail(self):
        sql = "select sum(opfare),count(acccode),dscrp from rec_cust_acc where opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') group by dscrp"
        self.sumtail = tk.Tk()
        self.sumtail.title('XX学院汇总查询')
        self.sumtail.geometry("800x600")
   
        # 加载滚动条
        # exportbtn = Button(sumtail,text='导出',width=8,command=export).pack()
        scrollBar = tk.Scrollbar(self.sumtail)
        scrollBar.pack(side = tk.RIGHT,fill = tk.Y)
        self.tree = ttk.Treeview(self.sumtail, columns=('sum', 'count', 'dscrp'), show="headings", displaycolumns="#all",yscrollcommand = scrollBar.set)
        self.tree.pack()
        self.tree.heading('sum', text="总金额", anchor=tk.W)
        self.tree.heading('count', text="总次数", anchor=tk.W)
        self.tree.heading('dscrp', text="交易类型", anchor=tk.W)
        # 设置关联
        scrollBar.config(command = self.tree.yview)
        # 每次打开清空页面
        for item in self.tree.get_children():
            self.tree.delete(item)
        # sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
        preopdt=self.pretimeInput.get()
        nextopdt=self.nexttimeInput.get()
        data = self.cursor.execute(sql,(preopdt,nextopdt)).fetchall()
        # print(data)
        for itm in data:
            self.tree.insert("",tk.END,values=itm)
            self.tree.pack(padx=10,pady=10, fill=tk.BOTH,expand=1)

        exportbtn = tk.Button(self.sumtail,text='导出',width=8,command=self.export).pack()

    # 个人明细
    def personDetail(self):
        if(self.outidInput.get()):
            print('outid not is null')
            sql="select a.outid ,a.name ,b.opfare,b.oddfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') and a.outid = :outid order by b.opdt desc"
            outidname = self.outidInput.get()
        elif(self.nameInput.get()):
            sql="select a.outid ,a.name ,b.opfare,b.oddfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') and a.name like :name order by b.opdt desc"
            outidname = self.nameInput.get()
        else:
            messagebox.showwarning("提示", "请输入学号或者姓名!")
            return
        self.persontail = tk.Tk()
        self.persontail.title('XX学院个人查询')
        self.persontail.geometry("1200x600")
    
        # 加载滚动条
        # exportbtn = Button(persontail,text='导出',width=8,command=export).pack()
        scrollBar = tk.Scrollbar(self.persontail)
        scrollBar.pack(side = tk.RIGHT,fill = tk.Y)
        self.tree = ttk.Treeview(self.persontail, columns=('outid', 'name', 'opfare','oddfare', 'opdt','dscrp'), show="headings", displaycolumns="#all",yscrollcommand = scrollBar.set)
        self.tree.pack()
        self.tree.heading('outid', text="学号", anchor=tk.W)
        self.tree.heading('name', text="姓名", anchor=tk.W)
        self.tree.heading('opfare', text="交易金额", anchor=tk.W)
        self.tree.heading('oddfare', text="账户余额", anchor=tk.W)
        self.tree.heading('opdt', text="交易日期", anchor=tk.W)
        self.tree.heading('dscrp', text="交易类型", anchor=tk.W)
        # 设置关联
        scrollBar.config(command = self.tree.yview)
        # 每次打开清空页面
        for item in self.tree.get_children():
            self.tree.delete(item)
        # sql = "select a.outid ,a.name ,b.opfare,b.opdt,b.dscrp from base_customers a,rec_cust_acc b where a.customerid = b. customerid and b.opdt >= to_date(:preopdt,'yyyy-MM-dd HH24:mi:ss') and b.opdt <= to_date(:nextopdt,'yyyy-MM-dd HH24:mi:ss') order by b.opdt desc"
        preopdt=self.pretimeInput.get()
        nextopdt=self.nexttimeInput.get()
        # print(outidname)
        data = self.cursor.execute(sql,(preopdt,nextopdt,outidname)).fetchall()
        # print(data)
        for itm in data:
            self.tree.insert("",tk.END,values=itm)
            self.tree.pack(padx=10,pady=10, fill=tk.BOTH,expand=1)
        def export():
        # 导出export        
             # 打开文件夹选择对话框
            folder_path = filedialog.asksaveasfilename(title='请选择一个文件',filetypes=[("CSV", ".csv")]) 
            # 更新标签文本
            print(folder_path)
            list = []
            for row_id in self.tree.get_children():
                list.append(self.tree.item(row_id)['values'])
            with open(f'{folder_path}.csv','w',newline='') as csvfile:
                fieldnames = ['学号', '姓名', '交易金额','账户余额','交易日期','交易类型']
                writer = csv.writer(csvfile)
                writer.writerow(fieldnames)
                writer.writerows(list)

        exportbtn = tk.Button(self.persontail,text='导出',width=8,command=self.export).pack()


    def export(self):
        # 导出export        
         # 打开文件夹选择对话框
        
        # 更新标签文本
        # print(folder_path)
        list = []
        columns = []
        # 获取表格内容id
        for row_id in self.tree.get_children():
            list.append(self.tree.item(row_id)['values'])
        print(len(self.tree.get_children()))   
        # 通过第一行获取列数生成标题
        # print(self.tree.item)
        if len(self.tree.get_children()) != 0:
            print('ok')
            folder_path = filedialog.asksaveasfilename(title='请选择一个文件',filetypes=[("CSV", ".csv")]) 
            for i in range(0,len(self.tree.item('I001')['values'])):
                columns.append(self.tree.heading(column=i)['text'])
        # 导出csv
            with open(f'{folder_path}.csv','w',newline='') as csvfile:
                fieldnames = columns
                writer = csv.writer(csvfile)
                writer.writerow(fieldnames)
                writer.writerows(list)
        else:
            messagebox.showwarning("提示", "没有数据,无法导出")
            return

if __name__ == "__main__":
    root = tk.Tk()
    app =  mainApp(root)
    root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/105141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卡巴斯基8(2009)杀毒软件

下载地址&#xff1a;https://user.qzone.qq.com/512526231/main https://user.qzone.qq.com/3503787372/main

Kafka KRaft模式探索

1.概述 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。其核心组件包含Producer、Broker、Consumer&#xff0c;以及依赖的Zookeeper集群。其中Zookeeper集群是Kafka用来负责集群元数据的管理、控制器的选举等。 2.内容…

Flutter extended_image库设置内存缓存区大小与缓存图片数

ExtendedImage ExtendedImage 是一个Flutter库&#xff0c;用于提供高级图片加载和显示功能。这个库使用了 image 包来进行图片的加载和缓存。如果你想修改缓存大小&#xff0c;你可以通过修改ImageCache的配置来实现。 1. 获取ImageCache实例: 你可以通过PaintingBinding…

css 雷达扫描图

html 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css 雷达扫描</title><style>* {margin: 0;padding: 0;}body {background: #000000;height: 100vh;display: flex;align-items…

Java基础总结

0、Java语言 1.java和c 2.编译和解释 3.jre和jdk&#xff0c;jvm 简单来说&#xff0c;编译型语言是指编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码&#xff1b;解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。 Java 语言既具…

【单片机学习笔记】Windows+Vscode+STM32F4+freeRTOS+FatFs gcc环境搭建

为摒弃在接受keil邮件&#xff0c;研究了下gun编译&#xff0c;以STM32F407为例&#xff0c;简单记录 1. 软件包准备 Git 选择对应版本直接安装即可https://git-scm.com/download/winmakegcc ​ 1&#xff09;将上述软件包放置于C盘根目录 2&#xff09;添加环境变量 3&am…

[SpringCloud] Eureka 与 Ribbon 简介

目录 一、服务拆分 1、案例一&#xff1a;多端口微服务 2、案例二&#xff1a;服务远程调用 二、Eureka 1、Eureka 原理分析 2、Eureka 服务搭建&#xff08;注册 eureka 服务&#xff09; 3、Eureka 服务注册&#xff08;注册其他服务&#xff09; 4、Eureka 服务发现…

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

【组合计数】CF1866 H

Problem - H - Codeforces 题意 思路 不知道这种trick叫什么&#xff0c;昨天VP刚遇到过 设 f[x] 为恰好有一个最大值为 x 的方案数&#xff0c;我们要求这个&#xff0c;那就设 g[x] 为 至少有一个最大值为 x 的方案数&#xff0c;那么答案就是 f[x] g[x] - g[x - 1] 这里…

FL Studio21版无限破解版下载 软件内置破解补丁

FL Studio是一款非常好用方便的音频媒体制作工具&#xff0c;它的功能是非常的强大全面的&#xff0c;想必那些喜欢音乐创作的朋友们应该都知道这款软件是多么的好用吧&#xff0c;它还能够给用户们带来更多的创作灵感&#xff0c;进一步加强提升我们的音乐制作能力。该软件还有…

浅谈uniapp中开发安卓原生插件

其实官方文档介绍的比较清楚而且详细,但是有时候他太墨迹,你一下子找不到自己想要的,所以我总结了一下开发的提纲,也是为了自己方便下次使用。 1.第一步,下载官方提供的Android的示例工程,然后倒入UniPlugin-Hello-AS工程请在App离线SDK中查找,之后Android studio,编译运行项目…

Android Studio Gradle中没有Task任务,没有Assemble任务,不能方便导出aar包

Gradle中&#xff0c;没有Assemble任务 1. 在编译aar包或者编译module的时候&#xff0c;没有release包&#xff0c;我们一般都是通过assemble进行编译。 如果在Gradle中找不到task。 可以通过设置File->setting -->Experimental→取消勾选“Do not build Gradle task …

wordpress数据库迁移Invalid default value for ‘comment_date‘

问题说明 最近在往新的电脑上迁移一个wordpress网站&#xff0c;在往新电脑上的mysql数据库中导入数据时&#xff0c;报错&#xff1a;1067 - Invalid default value for comment_date。 异常分析 这个错误的字面意思就是字段‘comment_date’的默认值是无效的&#xff0c;于…

Flink将数据写入MySQL(JDBC)

一、写在前面 在实际的生产环境中&#xff0c;我们经常会把Flink处理的数据写入MySQL、Doris等数据库中&#xff0c;下面以MySQL为例&#xff0c;使用JDBC的方式将Flink的数据实时数据写入MySQL。 二、代码示例 2.1 版本说明 <flink.version>1.14.6</flink.version…

UE5 Blueprint发送http请求

一、下载插件HttpBlueprint、Json Blueprint Utilities两个插件是互相依赖的&#xff0c;启用&#xff0c;重启项目 目前两个是Beta的状态&#xff0c;如果你使用的平台支持就可以使用&#xff0c;我们的项目因为需要取Header的值&#xff0c;所有没法使用这两个插件&#xff0…

单链表的定义(数据结构与算法)

单链表的定义 单链表是一种常见的数据结构&#xff0c;用于存储元素的序列。它由一系列节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的引用&#xff08;指针&#xff09;。单链表中的节点之间通过指针连接起来&#xff0c;形成一个线性结构。单链表是一种…

【Elasticsearch】es脚本编程使用详解

目录 一、es脚本语言介绍 1.1 什么是es脚本 1.2 es脚本支持的语言 1.3 es脚本语言特点 1.4 es脚本使用场景 二、环境准备 2.1 docker搭建es过程 2.1.1 拉取es镜像 2.1.2 启动容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 2.2 docker搭建kibana过程 2.2.1 拉取ki…

Git的远程仓库

Git的远程仓库 添加远程仓库从远程库克隆 添加远程仓库 你在本地创建了一个Git仓库后&#xff0c;又想在GitHub创建一个Git仓库&#xff0c;并且让这两个仓库进行远程同步&#xff0c;这样&#xff0c;GitHub上的仓库既可以作为备份&#xff0c;又可以让其他人通过该仓库来协作…

如何在VScode中让printf输出中文

如何在VScode中让printf输出中文&#xff1f; 1、在“Visual Studio Code”图标上右击&#xff0c;弹出对话框。见下图&#xff1a; 2、点击“以管理员身份运行”&#xff0c;得到下图&#xff1a; 3、点击“UTF-8”按钮&#xff0c;得到下图&#xff1a; 4、点击“通过编码重…