当前位置: 首页 > news >正文

Python绘图系统10:在父组件中使用子组件的函数

文章目录

    • Combobox绑定事件
    • 互相调用
    • 源代码

Python绘图系统:

  • 📈从0开始实现一个三维绘图系统
  • 自定义控件:坐标设置控件📉坐标列表控件📉支持多组数据的绘图系统
  • 图表类型和风格:散点图和条形图📊混合类型图表

Combobox绑定事件

DrawType类可以设置绘图维度,而绘图维度和坐标轴的个数是息息相关的。换言之,一个比较合理的交互逻辑是,改选DrawType的维度后,就应该可以改变坐标轴的个数。为了实现这个功能,需要为ComboBox绑定一个事件,改动起来非常简单,只需在initWidgets最后加上一行就可以。

def initWidgets(self, ws):if ws==None: ws = [8, 3]slct = ttk.Combobox(self, width=ws[0], textvariable=self.drawType)slct['value'] = self.typesslct.pack(side=tk.LEFT)slct = ttk.Combobox(self, width=ws[1], textvariable=self.drawDim)slct['value'] = self.dimsslct.pack(side=tk.LEFT)slct.bind('<<ComboboxSelected>>', self.dimChanged)

接下来比较重要的则是self.dimChanged的定义。由于我们希望当Combobox改变时,是另一个控件的内容发生变化,所以self.dimChanged最好是其他控件传入的一个函数。故而需要更改DrawType的初始化函数,即添加一个func参数,然后把这个参数赋给self.dimChanged方法。

def __init__(self, master, types, slctType, slctDim="3", ws=None, func=None, **options):super().__init__(master, **options)#。。。self.dimChanged = func# 。。。

互相调用

最后,修改AxisList中初始化DrawType的语句

self.drawTypeDim = DrawType(frm, types, slctType,  func=self.dimChanged)

并创建self.dimChanged函数,代码如下,逻辑是根据当前选择的维度来更新txyz这几个AxisFrame。

def dimChanged(self, evt):txyz = self.getDrawDim()for flag in 'txyz':self.vis[flag] = flag in txyzself.updateVisible()def updateVisible(self):for flag in 'txyz':self.afs[flag].pack_forget()for flag in 'txyz':if self.vis[flag]:self.afs[flag].pack(side=tk.TOP, fill=tk.X)

效果如下

在这里插入图片描述
最后的最后,在坐标轴创建时也应该遵循绘图维度和坐标个数之间的关系,这样打开软件或者新创建一组坐标的时候,就可以自动与绘图维度相匹配了。

def initAxis(self, mode, widths):for flag in 'txyz':self.afs[flag] = AxisFrame(self._c, flag, mode, widths)self.afs[flag].pack(side=tk.TOP, fill=tk.X)self.vis = {L : L in self.getDrawDim() for L in 'txyz'}self.updateVisible()

源代码

import tkinter as tk
import tkinter.ttk as ttk
from tkinter.filedialog import askopenfilenameimport matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figureimport numpy as npclass AxisFrame(ttk.Frame):# widths 是每个控件的宽度def __init__(self, master, label, mode, widths, **options):super().__init__(master, **options)self.pack()self.label = labelself.initVar(mode)self.initWidgets(widths)def initVar(self, mode):self.MODES = ("序列化", "源代码", "外部导入", "无数据")self.mode = tk.StringVar()self.setMode(mode)def initWidgets(self, widths):tk.Label(self, text=self.label, width=widths[0]).pack(side=tk.LEFT)self.slct = ttk.Combobox(self, width=widths[1], textvariable=self.mode)self.slct['value'] = self.MODESself.slct.pack(side=tk.LEFT)self.entry = tk.Entry(self, width=widths[2])self.entry.pack(padx=5, side=tk.LEFT, fill=tk.X)def setText(self, text):self.entry.delete(0, "end")self.entry.insert(0, text)def get(self):return self.entry.get()def setMode(self, mode):if type(mode) != str:mode = self.MODES[mode]self.mode.set(mode)def setData(self, data=None, **txyz):if self.mode.get() == "序列化":return self.getArray()elif self.mode.get() == "外部导入":return self.loadData(data)else:return self.readPython(**txyz)def readPython(self, t=None, x=None, y=None, z=None):self.data = eval(self.get())return self.datadef loadData(self, data):if type(data) != type(None):self.data = datareturn self.datadef getArray(self):val = self.get()self.data = eval(f"np.linspace({val})")return self.dataclass AxisList(ttk.Frame):def __init__(self, master, title, mode, widths, types, slctType,        # 绘图类型Combobox的参数**options):super().__init__(master, **options)self.pack()self.afs = {}self.data = {}self.initWidgets(title, widths)self.initFeature(types, slctType)self.initAxis(mode, widths)def initWidgets(self, title, widths):self.btn = ttk.Button(self, text=title, width=sum(widths)+5,command=self.Click)self.btn.pack(side=tk.TOP, fill=tk.X, expand=tk.YES)self._c = ttk.Frame(self)self.collapsed = Trueself.Click()def initFeature(self, types, slctType):frm = ttk.Frame(self._c)frm.pack(pady=2, side=tk.TOP, fill=tk.X)ttk.Button(frm, text="加载",width=5,command=self.btnLoadData).pack(side=tk.LEFT)frm = ttk.Frame(self._c)frm.pack(pady=2, side=tk.TOP, fill=tk.X)self.drawTypeDim = DrawType(frm, types, slctType, func=self.dimChanged)self.drawTypeDim.pack(side=tk.LEFT)self.vis = {L : True for L in 'txyz'}for flag in 'txyz':btn = ttk.Button(frm, text=flag, width=3)btn.pack(side=tk.LEFT)btn.bind("<Button-1>", self.btnAxisCollapse)def dimChanged(self, evt):txyz = self.getDrawDim()for flag in 'txyz':self.vis[flag] = flag in txyzself.updateVisible()def updateVisible(self):for flag in 'txyz':self.afs[flag].pack_forget()for flag in 'txyz':if self.vis[flag]:self.afs[flag].pack(side=tk.TOP, fill=tk.X)def getDrawType(self):return self.drawTypeDim.getType()def getDrawDim(self):return self.drawTypeDim.getDim()def initAxis(self, mode, widths):for flag in 'txyz':self.afs[flag] = AxisFrame(self._c, flag, mode, widths)self.afs[flag].pack(side=tk.TOP, fill=tk.X)self.vis = {L : L in self.getDrawDim() for L in 'txyz'}self.updateVisible()def btnAxisCollapse(self, evt):flag = evt.widget['text']self.vis[flag] = not self.vis[flag]self.updateVisible()def btnLoadData(self):name = askopenfilename()data = np.genfromtxt(name)for i, flag in enumerate('xyz'):if i >= data.shape[1]:returnself.setOneMode(flag, "外部导入")self.data[flag] = self.setData(flag, data[:,i])def Click(self):if self.collapsed:self._c.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES)            else:self._c.pack_forget()self.collapsed = not self.collapseddef setData(self, flag, data=None, **options):return self.afs[flag].setData(data, **options)def setOneMode(self, flag, mode):self.afs[flag].setMode(mode)# 绘图类型和维度
class DrawType(ttk.Frame):# ws为两个combobox的宽def __init__(self, master, types, slctType, slctDim="3", ws=None, func=None, **options):super().__init__(master, **options)self.pack()self.types = types  # 绘图类型self.dims = ("1", "2", "3", "1+1", "2+1", "3+1")    # 绘图维度self.dimChanged = funcself.initVar(slctType, slctDim)self.initWidgets(ws)def initVar(self, slctType, dim):self.drawType = tk.StringVar()self.drawType.set(slctType)self.drawDim = tk.StringVar()if type(dim) != str:dim = self.dims[int(dim)]self.drawDim.set(dim)def initWidgets(self, ws):if ws==None: ws = [8, 3]slct = ttk.Combobox(self, width=ws[0], textvariable=self.drawType)slct['value'] = self.typesslct.pack(side=tk.LEFT)slct = ttk.Combobox(self, width=ws[1], textvariable=self.drawDim)slct['value'] = self.dimsslct.pack(side=tk.LEFT)slct.bind('<<ComboboxSelected>>', self.dimChanged)def getType(self):return self.drawType.get()def getDim(self):dim = self.drawDim.get()dimDct = {"1"  :  "x", "2"  :  "xy", "3"  : "xyz", "1+1": "tx", "2+1": "txy", "3+1":  "txyz"}return dimDct[dim]class DarwSystem():def __init__(self):self.root = tk.Tk()self.root.title("数据展示工具")self.data = {}self.als = []self.initConst()self.setFrmCtrl()frmFig = ttk.Frame(self.root)frmFig.pack(side=tk.LEFT,fill=tk.BOTH,expand=tk.YES)self.setFrmFig(frmFig)self.root.mainloop()def initConst(self):self.TYPES = ("点线图", "散点图", "条形图")self.drawDct = {"点线图" : self.drawPlot,"散点图" : self.drawScatter,"条形图" : self.drawBar}def setFrmCtrl(self):frmCtrl = ttk.Frame(self.root,width=320)frmCtrl.pack(side=tk.RIGHT, fill=tk.Y)frm = ttk.Frame(frmCtrl, width=320)frm.pack(side=tk.TOP, fill=tk.X)self.setCtrlButtons(frm)self.frmAxis = ttk.Frame(frmCtrl)self.frmAxis.pack(side=tk.TOP, fill=tk.X)self.addLast(None)# ! 工具栏def setCtrlButtons(self, frm):self.drawTypeDim = DrawType(frm, self.TYPES, "点线图")self.drawTypeDim.pack(side=tk.LEFT)ttk.Button(frm, text="绘图",width=5,command=self.btnDrawImg).pack(side=tk.LEFT)ttk.Button(frm, text="加载",width=5,command=self.btnLoadData).pack(side=tk.LEFT)btn = ttk.Button(frm, text="+", width=3)btn.pack(side=tk.LEFT)btn.bind("<Button-1>", self.addLast)btn = ttk.Button(frm, text="-", width=3)btn.pack(side=tk.LEFT)btn.bind("<Button-1>", self.deleteLast)def addLast(self, evt):title = f"坐标{len(self.als)}"al = AxisList(self.frmAxis, title, 1, [5,10,20], self.TYPES, self.drawTypeDim.getType())al.pack(side=tk.TOP, fill=tk.X)self.als.append(al)def deleteLast(self, evt):self.als[-1].pack_forget()del self.als[-1]def btnLoadData(self):name = askopenfilename()data = np.genfromtxt(name)for i, flag in enumerate('xyz'):if i >= data.shape[1]:returnself.AL.setOneMode(flag, "外部导入")self.data[flag] = self.AL.setData(flag, data[:,i])def readDatas(self, al):dct = {}data = {}for flag in 'xyz':data[flag] = al.setData(flag, **dct)dct[flag] = data[flag]return datadef btnDrawImg(self):self.fig.clf()keys = self.drawTypeDim.getDim()p = '3d' if 'z' in keys else Noneax = self.fig.add_subplot(projection=p)for al in self.als:data = self.readDatas(al)draw = self.drawDct[al.getDrawType()]draw(ax, data, keys)self.fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.08)self.canvas.draw()def drawBar(self, ax, data, keys):ax.bar(data['x'], data['y'])def drawPlot(self, ax, data, keys):ax.plot(*[data[key] for key in keys])def drawScatter(self, ax, data, keys):ax.scatter(*[data[key] for key in keys])def setFrmFig(self, frmFig):self.fig = Figure()self.canvas = FigureCanvasTkAgg(self.fig,frmFig)self.canvas.get_tk_widget().pack(side=tk.TOP,fill=tk.BOTH,expand=tk.YES)self.toolbar = NavigationToolbar2Tk(self.canvas,frmFig,pack_toolbar=False)self.toolbar.update()self.toolbar.pack(side=tk.RIGHT)if __name__ == "__main__":test = DarwSystem()

相关文章:

Python绘图系统10:在父组件中使用子组件的函数

文章目录 Combobox绑定事件互相调用源代码 Python绘图系统&#xff1a; &#x1f4c8;从0开始实现一个三维绘图系统自定义控件&#xff1a;坐标设置控件&#x1f4c9;坐标列表控件&#x1f4c9;支持多组数据的绘图系统图表类型和风格&#xff1a;散点图和条形图&#x1f4ca;混…...

【Linux的成长史】Linux的发展史

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 数据库专栏 初阶数据结构 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如…...

OLED透明屏是什么?什么叫做OLED透明屏的原屏?

OLED透明屏是一种新型的显示技术&#xff0c;具有高对比度、高亮度和能耗低等优势&#xff0c;正被越来越广泛地应用于各个领域中。 在OLED透明屏中&#xff0c;原屏是至关重要的元件之一。本文将深入探讨OLED透明屏原屏的意义、制造过程、品质要求、应用案例和发展趋势&#…...

Redis 持久化的手段有哪些 ?RDB 和 AOF 有什么区别 ?

目录 1. Redis 持久化的手段有哪些 2. RDB 和 AOF 有什么区别 2.1 RDB 持久化 2.2 AOF 持久化 2.2.1 AOF 持久化策略有哪些 3. 混合持久化是如何执行的&#xff08;了解&#xff09; 1. Redis 持久化的手段有哪些 Redis 持久化的手段有三种&#xff1a; 快照方式&#…...

【Vue】vue2预览显示quill富文本内容,vue-quill-editor回显页面,v-html回显富文本内容

文章目录 前言一、下载二、使用步骤1.引入样式2.html代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; vue后台框架&#xff0c;若依系统里有一个富文本编辑器&#xff0c;效果如下 在package.json里面查看&#xff0c;发现插件名叫quill 插件的…...

华纳云:ubuntu下nginx服务器如何配置

在Ubuntu操作系统上配置Nginx服务器涉及以下步骤。这里我将提供一个基本的配置示例&#xff0c;你可以根据自己的需求进行修改和定制。 安装 Nginx&#xff1a; 打开终端&#xff0c;并输入以下命令来安装 Nginx&#xff1a; sudo apt update sudo apt install nginx 启动 …...

PTP时间同步例程

下面是一个基本的PTP时间同步例程&#xff0c;可以使用Arduino或其他类似的微控制器实现&#xff1a; 步骤1&#xff1a;准备硬件 - 一个Arduino或类似的微控制器 - 一个以太网模块 步骤2&#xff1a;导入库文件 #include <Ethernet.h> #include <EthernetUdp.h>…...

【ES6】ES6遍历属性的方法

在ES6中&#xff0c;有几种遍历属性的方法&#xff0c;其中包括&#xff1a; 使用for…in循环和Object.keys()方法。 let obj {a: 1, b: 2, c: 3}; for (let key in obj) {console.log(obj[key]); }使用for…of循环和Object.values()方法。 let obj {a: 1, b: 2, c: 3}; f…...

【Web系列二十四】使用JPA简化持久层接口开发

目录 环境配置 1、引入依赖 配置文件 代码编写 实体类创建 JPA常用注解 Service与ServiceImpl Service ServiceImpl Controller Dao 三种实现Dao功能方式 1.继承接口&#xff0c;使用默认接口实现 2.根据接口命名规则默认生成实现 3.自定义接口实现(类似MyBatis…...

Flink流批一体计算(16):PyFlink DataStream API

目录 概述 Pipeline Dataflow 代码示例WorldCount.py 执行脚本WorldCount.py 概述 Apache Flink 提供了 DataStream API&#xff0c;用于构建健壮的、有状态的流式应用程序。它提供了对状态和时间细粒度控制&#xff0c;从而允许实现高级事件驱动系统。 用户实现的Flink程…...

软考高级系统架构设计师系列论文九十三:论计算机网络的安全性设计

软考高级系统架构设计师系列论文九十三:论计算机网络的安全性设计 一、计算机网络安全性设计相关知识点二、摘要三、正文四、总结一、计算机网络安全性设计相关知识点 软考高级系统架构设计师:计算机网络...

山西电力市场日前价格预测【2023-08-29】

日前价格预测 预测明日&#xff08;2023-08-29&#xff09;山西电力市场全天平均日前电价为321.48元/MWh。其中&#xff0c;最高日前电价为372.80元/MWh&#xff0c;预计出现在19: 30。最低日前电价为272.85元/MWh&#xff0c;预计出现在12: 30。 价差方向预测 1&#xff1a; 实…...

计算机毕设 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新…...

ES 7.6 - APi基础操作篇

ES7.6-APi基础操作篇 前言相关知识索引相关创建索引查询索引查询所有索引删除索引关闭与打开索引关闭索引打开索引 冻结与解冻索引冻结索引解冻索引 映射相关创建映射查看映射新增字段映射 文档相关(CURD)新增文档根据ID查询修改文档全量覆盖根据ID选择性修改根据条件批量更新 …...

【Go 基础篇】Go语言循环结构:实现重复执行与迭代控制

介绍 循环结构是编程中的重要概念&#xff0c;它允许我们重复执行一段代码块&#xff0c;或者按照一定的条件进行迭代控制。Go语言提供了多种循环结构&#xff0c;包括for、while和do-while等&#xff0c;用于不同的场景下实现循环操作。本篇博客将深入探讨Go语言中的循环结构…...

RabbitMQ笔记-RabbitMQ基本术语

RabbitMQ基本术语 相关概念; 生产者&#xff08;Producer&#xff09;&#xff1a;投递消息。消息&#xff1a;消息体&#xff08;payload&#xff09;标签&#xff08;label&#xff09;&#xff1b;生产者把消息交给rabbitmq&#xff0c;rabbitmq会根据标签把消息发给感兴趣…...

Git向远程仓库与推送以及拉取远程仓库

理解分布式版本控制系统 1.中央服务器 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地也就是在你的笔记本或者计算机上。⽽我们的 Git 其实是分布式版本控制系统&#xff01;什么意思呢? 那我们多人…...

PostgreSQL+SSL链路测试

SSL一个各种证书在此就不详细介绍了&#xff0c;PostgreSQL要支持SSL的前提需要打开openssl选项&#xff0c;包括客户端和服务器端。 测试过程。 1. 生成私钥 root用户&#xff1a; mkdir -p /opt/ssl/private mkdir -p /opt/ssl/share/ca-certificateschmod 755 -R /opt/ss…...

服务器(容器)开发指南——code-server

文章目录 code-server简介code-server的安装与使用code-server的安装code-server的启动code-server的简单启动指定配置启动code-server code-server环境变量配置 code-server端口转发自动端口转发手动添加转发端口 nginx反向代理code-servercode-server打包开发版镜像 GitHub官…...

C++贪吃蛇(控制台版)

C自学精简实践教程 目录(必读) 目录 主要考察 需求 输入文件 运行效果 实现思路 枚举类型 enum class 启动代码 输入文件data.txt 的内容 参考答案 学生实现的效果 主要考察 模块划分 文本文件读取 UI与业务分离 控制台交互 数据抽象 需求 用户输入字母表示方…...

Java之字符串实践

功能概述 字符串是Java编程中常用的数据类型&#xff0c;本文对String部分常见功能做了对应实践以及分析。 功能实践 场景1&#xff1a;字符串比较 用例代码 Test public void test_string_compare() {String s1 "abc";String s2 s1;String s5 "abc&quo…...

BM20 数组中的逆序对

描述 解题思路&#xff1a;归并排序 分治&#xff1a;分治即“分而治之”&#xff0c;“分”指的是将一个大而复杂的问题划分成多个性质相同但是规模更小的子问题&#xff0c;子问题继续按照这样划分&#xff0c;直到问题可以被轻易解决&#xff1b;“治”指的是将子问题单独进…...

高德猎鹰轨迹查询相关接口

高德猎鹰轨迹官网&#xff1a;服务管理-API文档-开发指南-猎鹰轨迹服务 | 高德地图API 轨迹查询 httpclient的post // post方法请求 创建轨迹 private static void createTrace() {String key "高德注册的key";String sid "服务id"; // 服务idString…...

整理总结新手开始抖音小店经营:常见问题及解决办法

抖音小店作为一种新兴的电商模式&#xff0c;在短时间内获得了广泛的关注和使用。然而&#xff0c;对于新手来说&#xff0c;抖音小店经营可能会遇到一些问题。下面是四川不若与众总结的一些常见的问题以及相应的解决办法。 问题一&#xff1a;产品选择困难 对于新手来说&#…...

4-1-netty

非阻塞io 服务端就一个线程&#xff0c;可以处理无数个连接 收到所有的连接都放到集合channelList里面 selector是有事件集合的 对server来说优先关注连接事件 遍历连接事件...

hive 动态分区-动态分区数量太多也会导致效率下降只设置非严格模式也能执行动态分区

hive 动态分区-动态分区数量太多也会导致效率下降&只设置非严格模式也能执行动态分区 结论 在非严格模式下不开启动态分区的功能的参数&#xff08;配置如下&#xff09;&#xff0c;同样也能进行动态分区数据写入&#xff0c;目测原因是不严格检查SQL中是否指定分区或者…...

java八股文面试[JVM]——JVM调优

知识来源&#xff1a; 【2023年面试】JVM性能调优实战_哔哩哔哩_bilibili...

FairyGUI-Unity 异形屏适配

本文中会修改到FairyGUI源代码&#xff0c;涉及两个文件Stage和StageCamera&#xff0c;需要对Unity的屏幕类了解。 在网上查找有很多的异形屏适配操作&#xff0c;但对于FairyGUI相关的描述操作很少&#xff0c;这里我贴出一下自己在实际应用中的异形屏UI适配操作。 原理 获…...

Oracle监听器启动出错:本地计算机上的OracleOraDb11g_home1TNSListener服务启动后又停止了解决方案

在启动oracle的服务OracleOraDb11g_home1TNSListener时&#xff0c;提示服务启动后又停止了。 解决方法&#xff1a; 修改oracle安装目录下的两个配置文件&#xff1a; 以上两个文件&#xff0c;对应的HOST的值&#xff0c;都改为127.0.0.1 然后再启动服务&#xff0c;启动成…...

Spring复习:(58)<context:annotation-config/>的作用

引入如下的BeanPostProcessor • ConfigurationClassPostProcessor • AutowiredAnnotationBeanPostProcessor • CommonAnnotationBeanPostProcessor • PersistenceAnnotationBeanPostProcessor • EventListenerMethodProcessor如果xml文件配置了bean中使用了Autowired注解…...

wordpress sdk/百度快照网站

下面是我最近完成的一个音乐播放器&#xff0c;是仿照网易云音乐的排版做的&#xff0c;在做这个之前&#xff0c;感觉难以下手&#xff0c;但一步一步地经过3天的奋战&#xff0c;终于实现了音乐播放器的基本功能&#xff0c;如&#xff1a;动态生成播放列表、进度条的点击与拖…...

深圳十大景观设计公司排名/seo快速软件

如果把指标⽐喻成⼀棵树上的果实&#xff0c;那模型就是这棵⼤树的躯⼲&#xff0c;想让果实结得好&#xff0c;必须让树⼲变得粗壮。真实场景举例&#xff1a;⼤多数公司的分析师会结合业务做⼀些数据分析&#xff08;需要⽤到⼤量的数据&#xff09;&#xff0c;通过报表的⽅…...

用区块链来做网站/查询网站信息

倪光南院士一再警告国内企业需要加强自主技术研发&#xff0c;国内企业曾不屑一顾&#xff0c;但是随着2019年以来华为的遭遇终于让国内企业重视芯片技术研发了&#xff0c;如今又一家中国芯片企业再次打破了空白&#xff0c;研发出拥有自主知识产权的模拟芯片&#xff0c;打破…...

重庆建材网站建设/网站seo综合诊断

现在服务器的大多数是管理员来远程管理的&#xff0c;服务器所在的机房重地闲人免进&#xff0c;既安全&#xff0c;又能使得管理员们足不出户就可以登陆服务器。 远程登录服务器需要在服务器端开启“允许远程连接到此计算机”&#xff0c;右击“我的电脑”--“远程”--勾选“允…...

建网站底部怎么做的/独立站seo怎么做

一、修改httpd.conf文件 编辑配置文件&#xff1a; 目录&#xff1a;%xampp\apache\conf\httpd.conf#确认以下是否开启Include conf/extra/httpd-vhosts.conf#修改<Directory />参数<Directory />#AllowOverride none#Require all deniedOptions AllAllowOverride …...

个人是否可以做网站/软件培训机构排名

EL操作操作对象的方式 l 操作变量和常量&#xff1a;${name}、${8}&#xff1b; l 操作List和数组&#xff1a;${list[0]}、${arr[0]}&#xff1b; l 操作bean的属性&#xff1a;${person.name}、${person[‘name’]}&#xff0c;对应person.getName()方法&#xff1b; l 操…...