栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

【无标题】

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【无标题】

import tkinter as tk
import libvirt
from tkinter import messagebox
import tkinter.font as tkFont
from tkinter import *
import time
import paramiko

def get_window_size(win, update=True):
“”" 获得窗体的尺寸 “”"
if update:
win.update()
return win.winfo_width(), win.winfo_height(), win.winfo_x(), win.winfo_y()

创建镜像

def createjingxiang(name,node):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
a = ‘node’ + str(node)
b = 'qemu-img create -f qcow2 ’ + str(name) + ‘.qcow2 10G’
ssh.connect(hostname=a, username=‘mpiuser’, password=‘123456’)
try:
stdin, stdout, stderr = ssh.exec_command(b)
ssh.close()
except Exception as e:
tk.messagebox.showinfo(title=‘错误提示框’, message=str(e))

写xml文件

def writexml(name,cpun,memory):
file_object = open(‘ubuntu1.xml’,‘rU’)
file_context = file_object.read()
n=“”+str(name)+“”
c=“”+str(int(cpun))+“”
q=“ "
m=”“+str(memory1024)+“ ”+str(memory1024)+” "
a=file_context.replace(“ubuntu1”,n,1)
a=a.replace(“1”,c,1)
a=a.replace("1048576 1048576 “,m,1)
a=a.replace(” ",q,1)
return a

虚拟机参数

class VCPU:
def init(self):
self.NAME = ‘’ # 姓名
self.IP = ‘’
self.cpun = 0 # cpu个数
self.cpurate = 0 # cpu使用率
self.memoryrate = 0
self.memory = 0
self.stats = ‘’
self.node = 0

创建虚拟机

def create_machine(cpulist, kvmnet):
flag = False

def addcpu():
    flag = False
    a = VCPU()
    a.cpun = int(_cpun.get())
    a.NAME = _name.get()
    a.memory = int(_memory.get())  # mb
    NODE = int(_node.get())  # 输入node节点
    conn = libvirt.open(kvmnet[NODE - 1])
    NODE_free_memory = conn.getFreeMemory() / (1024 ** 2)  # Mb
    NODE_cpu_nums = conn.getCPUMap()[0]

    def change():
        tk.messagebox.showinfo(title='消息提示框', message='虚拟机创建成功')
        dom = conn.lookupByName(a.NAME)
        dom.create()
        cpulist.append(a)

    if a.memory < NODE_free_memory and a.cpun < NODE_cpu_nums:
        xmltext = writexml(a.NAME, a.cpun, a.memory)
        a.node = NODE
        try:
            createjingxiang(a.NAME, a.node)
            conn.defineXML(xmltext)  # 创建虚拟机
            createframe1 = tk.Toplevel()
            createframe1.geometry("%dx%d" % (500, 500))  # 窗体尺寸
            frameerror = tk.Frame(createframe1, bg="white")
            frameerror.pack()
            tk.Label(frameerror, text="请手动安装虚拟机操作系统! ", bg="white", fg='black', height=2,
                     font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=20, pady=10)
            tk.Button(frameerror, text='操作系统安装完成', width=10, height=1, bg='white', relief=GROOVE,
                      command=change).pack(
                side=tk.BOTTOM, padx=10)
        except Exception as e:
            tk.messagebox.showinfo(title='错误提示框', message=str(e))
            return

    else:

        for i in range(len(kvmnet)):
            conn = libvirt.open(kvmnet[i])
            if a.memory < conn.getFreeMemory() / (1024 ** 2) and a.cpun < conn.getCPUMap()[0]:
                xmltext = writexml(a.NAME, a.cpun, a.memory)
                a.node = i + 1
                try:
                    createjingxiang(a.NAME, a.node)
                    conn.defineXML(xmltext)  # 创建虚拟机
                    createframe1 = tk.Toplevel()
                    createframe1.geometry("%dx%d" % (400, 300))  # 窗体尺寸
                    frameerror = tk.Frame(createframe1, bg="white")
                    frameerror.pack(fill=tk.X)
                    tk.Label(frameerror, text="经过调整后,请在节点node"+str(a.node)+"请手动安装虚拟机操作系统! ", bg="white", fg='black', height=2, width=30,
                             font=tkFont.Font(family="微软雅黑", size=8)).pack()    # side=tk.LEFT, padx=20, pady=10
                    tk.Button(frameerror, text='操作系统安装完成', width=20, height=2, bg='white', relief=GROOVE,
                              command=change).pack()
                except Exception as e:
                    tk.messagebox.showinfo(title='错误提示框', message=str(e))
                    return

    if a.node == 0:
        tk.messagebox.showinfo(title='消息提示框', message='虚拟机设置有误,请重新创建')
        create_machine(cpulist, kvmnet)

createframe = tk.Toplevel()
createframe.geometry("%dx%d" % (400, 300))  # 窗体尺寸
screenwidth1 = createframe.winfo_screenwidth()
screenheight1 = createframe.winfo_screenheight()
width1, height1 = get_window_size(createframe)[:2]
size1 = '%dx%d+%d+%d' % (width1, height1, (screenwidth1 - width1) / 2, (screenheight1 - height1) / 3)
createframe.geometry(size1)  # 将窗体移动到屏幕中央
# 美观,填充间隔
frame_seperator3 = tk.Frame(createframe, height=20, bg="whitesmoke")
frame_seperator3.pack(fill=tk.X)
frame_seperator1 = tk.Frame(createframe, width=20, bg='whitesmoke')
frame_seperator1.pack(side=tk.RIGHT, fill=tk.Y)
frame_seperator2 = tk.Frame(createframe, width=20, bg='whitesmoke')
frame_seperator2.pack(side=tk.LEFT, fill=tk.Y)

frame1 = tk.Frame(createframe, bg="white")
frame1.pack(fill=tk.X)
tk.Label(frame1, text="节点:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=36, pady=10)
_node = tk.Entry(frame1, width=27)
_node.pack(side=tk.LEFT)

frame2 = tk.Frame(createframe, bg="white")
frame2.pack(fill=tk.X)
tk.Label(frame2, text="虚拟机名称:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=20, pady=10)
_name = tk.Entry(frame2, width=27)
_name.pack(side=tk.LEFT)

frame3 = tk.Frame(createframe, bg="white")
frame3.pack(fill=tk.X)
tk.Label(frame3, text="CPU个数:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=25, pady=10)
_cpun = tk.Entry(frame3, width=27)
_cpun.pack(side=tk.LEFT)

frame4 = tk.Frame(createframe, bg="white")
frame4.pack(fill=tk.X)
tk.Label(frame4, text="内存分配:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=25, pady=10)
_memory = tk.Entry(frame4, width=27)
_memory.pack(side=tk.LEFT)

frame5 = tk.Frame(createframe, bg="white")
frame5.pack(fill=tk.X)
tk.Button(frame5, text='确认', width=10, height=1, bg='white', relief=GROOVE, command=addcpu).pack(
    side=tk.RIGHT, padx=10)
删除虚拟机

def delete_machine(cpulist):
cpulist = update_machine(cpulist)
delframe = tk.Toplevel()
delframe.geometry(“%dx%d” % (400, 300))
screenwidth1 = delframe.winfo_screenwidth()
screenheight1 = delframe.winfo_screenheight()
width1, height1 = get_window_size(delframe)[:2]
size1 = ‘%dx%d+%d+%d’ % (width1, height1, (screenwidth1 - width1) / 2, (screenheight1 - height1) / 3)
delframe.geometry(size1)
delframe.title(“删除虚拟机”)

frame1 = tk.Frame(delframe, bg="white")
frame1.pack(fill=tk.X)
tk.Label(frame1, text="节点:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=36, pady=10)
_node = tk.Entry(frame1, width=27)
_node.pack(side=tk.LEFT)

frame2 = tk.Frame(delframe, bg="white")
frame2.pack(fill=tk.X)
tk.Label(frame2, text="虚拟机名称:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=20, pady=10)
_name = tk.Entry(frame2, width=27)
_name.pack(side=tk.LEFT)

namelist = []
for i in range(len(cpulist)):
    namelist.append(cpulist[i].NAME)

def dele():
    try:
        nameset = set(namelist)
        node_ = int(_node.get())  # 输入虚拟机所在节点号
        name_ = _name.get()  # 输入的虚拟机名称
        if name_ in nameset:  # 如果输入的虚拟机存在
            conn = libvirt.open(kvmnet[node_ - 1])
            dom = conn.lookupByName(name_)
            dom.destroy()  # 对所有虚拟机都是先关闭再删除 保证任何状态下的虚拟机都可以被删除
            dom.undefine()
            conn.close()
            messagebox.showinfo("提示", "删除成功!")
        else:
            messagebox.showinfo("警告", "虚拟机不存在!")
    except Exception as e:
        tk.messagebox.showinfo(title='错误提示框', message=str(e))
        return

tk.Button(delframe, text='确认', width=10, height=1, bg='white', command=dele).pack(
    side=tk.RIGHT, padx=10)
开启虚拟机

def open_machine(cpulist):
kvmlist = update_machine(cpulist)
delframe = tk.Toplevel()
delframe.geometry(“%dx%d” % (400, 300))
screenwidth1 = delframe.winfo_screenwidth()
screenheight1 = delframe.winfo_screenheight()
width1, height1 = get_window_size(delframe)[:2]
size1 = ‘%dx%d+%d+%d’ % (width1, height1, (screenwidth1 - width1) / 2, (screenheight1 - height1) / 3)
delframe.geometry(size1)
delframe.title(“开启虚拟机”)
frame1 = tk.Frame(delframe, bg=“white”)
frame1.pack(fill=tk.X)
tk.Label(frame1, text=“节点:”, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=8)).pack(side=tk.LEFT, padx=36, pady=10)
_node = tk.Entry(frame1, width=27)
_node.pack(side=tk.LEFT)

frame2 = tk.Frame(delframe, bg="white")
frame2.pack(fill=tk.X)
tk.Label(frame2, text="虚拟机名称:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=20, pady=10)
_name = tk.Entry(frame2, width=27)
_name.pack(side=tk.LEFT)

namelist = []
for i in range(len(kvmlist)):
    namelist.append(kvmlist[i].NAME)

def creat():
    try:
        nameset = set(namelist)
        node_ = int(_node.get())  # 输入虚拟机所在节点号
        name_ = _name.get()  # 输入的虚拟机名称
        if name_ in nameset:  # 如果输入的虚拟机存在
            conn = libvirt.open(kvmnet[node_ - 1])
            dom = conn.lookupByName(name_)
            dom.create()
            conn.close()
            messagebox.showinfo("提示", "开启成功!")
        else:
            messagebox.showinfo("警告", "虚拟机不存在!")
    except Exception as e:
        tk.messagebox.showinfo(title='错误提示框', message=str(e))
        return

tk.Button(delframe, text='确认', width=10, height=1, bg='white', command=creat).pack(
    side=tk.RIGHT, padx=10)
关闭虚拟机

def shutdown_machine(cpulist):
cpulist = update_machine(cpulist)
delframe = tk.Toplevel()
delframe.geometry(“%dx%d” % (400, 300))
screenwidth1 = delframe.winfo_screenwidth()
screenheight1 = delframe.winfo_screenheight()
width1, height1 = get_window_size(delframe)[:2]
size1 = ‘%dx%d+%d+%d’ % (width1, height1, (screenwidth1 - width1) / 2, (screenheight1 - height1) / 3)
delframe.geometry(size1)
delframe.title(“关闭虚拟机”)
frame1 = tk.Frame(delframe, bg=“white”)
frame1.pack(fill=tk.X)
tk.Label(frame1, text=“节点:”, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=8)).pack(side=tk.LEFT, padx=36, pady=10)
_node = tk.Entry(frame1, width=27)
_node.pack(side=tk.LEFT)

frame2 = tk.Frame(delframe, bg="white")
frame2.pack(fill=tk.X)
tk.Label(frame2, text="虚拟机名称:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=20, pady=10)
_name = tk.Entry(frame2, width=27)
_name.pack(side=tk.LEFT)

namelist = []
for i in range(len(cpulist)):
    namelist.append(cpulist[i].NAME)

def dele():
    try:
        nameset = set(namelist)
        node_ = int(_node.get())  # 输入虚拟机所在节点号
        name_ = _name.get()  # 输入的虚拟机名称
        if name_ in nameset:  # 如果输入的虚拟机存在
            conn = libvirt.open(kvmnet[node_ - 1])
            dom = conn.lookupByName(name_)
            dom.destroy()
            conn.close()
            messagebox.showinfo("提示", "关闭成功!")
        else:
            messagebox.showinfo("警告", "虚拟机不存在!")

    except Exception as e:
        tk.messagebox.showinfo(title='错误提示框', message=str(e))
        return

tk.Button(delframe, text='确认', width=10, height=1, bg='white', command=dele).pack(
    side=tk.RIGHT, padx=10)
暂停虚拟机

def suspend_machine(cpulist):
cpulist = update_machine(cpulist)
delframe = tk.Toplevel()
delframe.geometry(“%dx%d” % (400, 300))
screenwidth1 = delframe.winfo_screenwidth()
screenheight1 = delframe.winfo_screenheight()
width1, height1 = get_window_size(delframe)[:2]
size1 = ‘%dx%d+%d+%d’ % (width1, height1, (screenwidth1 - width1) / 2, (screenheight1 - height1) / 3)
delframe.geometry(size1)
delframe.title(“暂停虚拟机”)
frame1 = tk.Frame(delframe, bg=“white”)
frame1.pack(fill=tk.X)
tk.Label(frame1, text=“节点:”, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=8)).pack(side=tk.LEFT, padx=36, pady=10)
_node = tk.Entry(frame1, width=27)
_node.pack(side=tk.LEFT)

frame2 = tk.Frame(delframe, bg="white")
frame2.pack(fill=tk.X)
tk.Label(frame2, text="虚拟机名称:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=20, pady=10)
_name = tk.Entry(frame2, width=27)
_name.pack(side=tk.LEFT)

namelist = []
for i in range(len(cpulist)):
    namelist.append(cpulist[i].NAME)
def suspend():
    try:
        nameset = set(namelist)
        print(nameset)
        node_ = int(_node.get())
        name_ = _name.get()  # 输入的虚拟机名称
        if name_ in nameset:  # 如果输入的虚拟机存在
            conn = libvirt.open(kvmnet[node_ - 1])
            dom = conn.lookupByName(name_)
            dom.suspend()
            messagebox.showinfo("提示", "暂停成功!")
        else:
            messagebox.showinfo("警告", "虚拟机不存在!")


    except Exception as e:
        tk.messagebox.showinfo(title='错误提示框', message=str(e))
        return
tk.Button(delframe, text='确认', width=10, height=1, bg='white', command=suspend).pack(
    side=tk.RIGHT, padx=10)
运行虚拟机

def resume_machine(cpulist):
cpulist = update_machine(cpulist)
delframe = tk.Toplevel()
delframe.geometry(“%dx%d” % (400, 300))
screenwidth1 = delframe.winfo_screenwidth()
screenheight1 = delframe.winfo_screenheight()
width1, height1 = get_window_size(delframe)[:2]
size1 = ‘%dx%d+%d+%d’ % (width1, height1, (screenwidth1 - width1) / 2, (screenheight1 - height1) / 3)
delframe.geometry(size1)
delframe.title(“运行虚拟机”)
frame1 = tk.Frame(delframe, bg=“white”)
frame1.pack(fill=tk.X)
tk.Label(frame1, text=“节点:”, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=8)).pack(side=tk.LEFT, padx=36, pady=10)
_node = tk.Entry(frame1, width=27)
_node.pack(side=tk.LEFT)

frame2 = tk.Frame(delframe, bg="white")
frame2.pack(fill=tk.X)
tk.Label(frame2, text="虚拟机名称:", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=8)).pack(side=tk.LEFT, padx=20, pady=10)
_name = tk.Entry(frame2, width=27)
_name.pack(side=tk.LEFT)

namelist = []
for i in range(len(cpulist)):
    namelist.append(cpulist[i].NAME)

def resume():
    try:
        nameset = set(namelist)
        print(nameset)
        node_ = int(_node.get())
        name_ = _name.get()  # 输入的虚拟机名称
        if name_ in nameset:  # 如果输入的虚拟机存在
            conn = libvirt.open(kvmnet[node_ - 1])
            dom = conn.lookupByName(name_)
            dom.resume()
            conn.close()
            messagebox.showinfo("提示", "运行成功!")
        else:
            messagebox.showinfo("警告", "虚拟机不存在!")

    except Exception as e:
        tk.messagebox.showinfo(title='错误提示框', message=str(e))
        return

tk.Button(delframe, text='确认', width=10, height=1, bg='white', command=resume).pack(
    side=tk.RIGHT, padx=10)
更新虚拟机状态

def update_machine(cpulist):
cpulist = []
for i in range(len(kvmnet)):
try:
conn = libvirt.open(kvmnet[i])
except:
continue
domlist = conn.listAllDomains()
nbcore = conn.getInfo()[2] # 用于计算cpu使用率
for dom in domlist:
ubuntu0 = VCPU()
ubuntu0.node = i + 1
state0, reason0 = dom.state()
ubuntu0.NAME = dom.name()
ubuntu0.IP = ’ ’
# if state0 == 1 and reason0 != 1:
print(ubuntu0.node, ubuntu0.NAME, dom.state())
if state0 == 1:
ubuntu0.stats = “运行中”
ubuntu0.cpun = dom.maxVcpus()
cpu_use_ago = dom.info()[4]
time.sleep(1)
cpu_use_now = dom.info()[4]
diff_use = cpu_use_now - cpu_use_ago
ubuntu0.cpurate = round(100 * diff_use / (1 * nbcore * 10 ** 9), 2)
ubuntu0.memory = dom.maxMemory()
instance_memory = dom.memoryStats()
print(instance_memory)
unused_memory = instance_memory[“unused”] # 未被使用得内存
total_memory = instance_memory[“actual”] # 被分配的
ubuntu0.memoryrate = round((1 - unused_memory / total_memory) * 100, 2)

        elif state0 == 5:
            # ubuntu0.stats = "关闭中" + str(state0) + "," + str(reason0)
            ubuntu0.stats = "关闭中"
        else:
            # ubuntu0.stats = "暂停中" + str(state0) + "," + str(reason0)
            ubuntu0.stats = "暂停中"

        cpulist.append(ubuntu0)
    conn.close()
return cpulist
显示信息

def showcpustate(parent,cpulist,i):
if cpulist[i].stats == ‘运行中’:
frame = tk.Frame(parent, bg=“white”)
tk.Label(frame, text=“node” + str(cpulist[i].node), bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11, weight=tkFont.BOLD)).pack(side=tk.LEFT, padx=10, pady=5)
tk.Label(frame, text="虚拟机名称: "+cpulist[i].NAME, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11, weight=tkFont.BOLD)).pack(side=tk.LEFT,padx=10, pady=5)
tk.Label(frame, text="cpu数量: “+str(cpulist[i].cpun), bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11)).pack(side=tk.LEFT, padx=5)
tk.Label(frame, text=“内存总量: " + str(cpulist[i].memory)+“kB”, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11)).pack(side=tk.LEFT, padx=5)
tk.Label(frame, text=“cpu使用率: " + str(cpulist[i].cpurate)+”%”, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11)).pack(side=tk.LEFT, padx=5)
tk.Label(frame, text=“内存使用率: " + str(cpulist[i].memoryrate)+”%”, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11)).pack(side=tk.LEFT, padx=5)
tk.Label(frame, text="状态: " +cpulist[i].stats, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11)).pack(side=tk.LEFT, padx=5)
else:
frame = tk.Frame(parent, bg=“white”)
tk.Label(frame, text=“node” + str(cpulist[i].node), bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11, weight=tkFont.BOLD)).pack(side=tk.LEFT, padx=10, pady=5)
tk.Label(frame, text="虚拟机名称: "+cpulist[i].NAME, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11, weight=tkFont.BOLD)).pack(side=tk.LEFT,padx=10, pady=5)
tk.Label(frame, text="状态: " +cpulist[i].stats, bg=“white”, fg=‘black’, height=2,
font=tkFont.Font(family=“微软雅黑”, size=11)).pack(side=tk.LEFT, padx=10)
return frame

更新显示虚拟机信息

def update_info(parent,cpulist):
cpulist = update_machine(cpulist)
for widget in parent.winfo_children():
widget.destroy()
print(“虚拟机个数:”, len(cpulist))
messagebox.showinfo(“提示”, “虚拟机个数为”+str(len(cpulist)))
for i in range(len(cpulist)):
frame_name = “frame”+str(i)
frame_name = showcpustate(parent, cpulist, i).pack(fill=tk.X)

if name == ‘main’:
# 例子
global cpulist, kvmnet
cpulist = []
kvmnet = [‘qemu+ssh://mpiuser@node1/system’, ‘qemu+ssh://mpiuser@node2/system’,
‘qemu+ssh://mpiuser@node3/system’]

root = tk.Tk()
root.geometry("%dx%d" % (2800, 3000))  # 窗体尺寸
screenwidth = root.winfo_screenwidth()
screenheight = root.winfo_screenheight()
width, height = get_window_size(root)[:2]
size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 3)
root.geometry(size)  # 将窗体移动到屏幕中央
root.title("虚拟机控制器")  # 窗体标题

# 核心框架
frame_main = tk.Frame(root, bg="whitesmoke")
frame_main.propagate(False)
frame_main.pack(expand=tk.YES, fill=tk.BOTH)

frame_maintop = tk.Frame(frame_main, height=180, bg="white")
frame_maintop.pack(side=tk.TOP, fill=tk.X, padx=30)
tk.Label(frame_maintop, text="管理中心", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=16, weight=tkFont.BOLD)).pack(anchor=tk.W, padx=20, pady=5)
bu2 = tk.Button(frame_maintop, text='创建虚拟机', width=25, height=2, bg='white', relief=FLAT,
                font=tkFont.Font(family="微软雅黑", size=12), command=lambda: create_machine(cpulist, kvmnet)).pack(padx=10, pady=5, side=LEFT)
bu3 = tk.Button(frame_maintop, text='删除虚拟机', width=25, height=2, bg='white', relief=FLAT,
                font=tkFont.Font(family="微软雅黑", size=12), command=lambda: delete_machine(cpulist)).pack(padx=10, pady=5, side=LEFT)
bu4 = tk.Button(frame_maintop, text='开启虚拟机', width=25, height=2, bg='white', relief=FLAT,
                font=tkFont.Font(family="微软雅黑", size=12), command=lambda: open_machine(cpulist)).pack(padx=10, pady=5, side=LEFT)
bu5 = tk.Button(frame_maintop, text='关闭虚拟机', width=25, height=2, bg='white', relief=FLAT,
                font=tkFont.Font(family="微软雅黑", size=12), command=lambda: shutdown_machine(cpulist)).pack(padx=10, pady=5, side=LEFT)
bu7 = tk.Button(frame_maintop, text='暂停虚拟机', width=25, height=2, bg='white', relief=FLAT,
                font=tkFont.Font(family="微软雅黑", size=12), command=lambda: suspend_machine(cpulist)).pack(padx=10, pady=5, side=LEFT)
bu6 = tk.Button(frame_maintop, text='运行虚拟机', width=25, height=2, bg='white', relief=FLAT,
                font=tkFont.Font(family="微软雅黑", size=12), command=lambda: resume_machine(cpulist)).pack(padx=10,pady=5, side=LEFT)
frame_maintop.propagate(False)
# 上下分界
frame_seperator1 = tk.Frame(frame_main, height=20, bg='whitesmoke')
frame_seperator1.pack(side=tk.BOTTOM, fill=tk.X)

frame_mainbottom = tk.Frame(frame_main, height=200, bg="white")
frame_mainbottom.pack(side=tk.BOTTOM, expand=tk.YES, fill=tk.BOTH)

frame_mainbottomtop = tk.Frame(frame_mainbottom, bg="white", height=80)
frame_mainbottomtop.pack(fill=tk.X, padx=20, pady=5)
frame_mainrightbot = tk.Frame(frame_mainbottom, bg="white", height=80)
frame_mainrightbot.pack(fill=tk.X, padx=20, pady=5)
tk.Label(frame_mainbottomtop, text="监控中心", bg="white", fg='black', height=2,
         font=tkFont.Font(family="微软雅黑", size=16, weight=tkFont.BOLD)).pack(side=LEFT, padx=20)
bu8 = tk.Button(frame_mainbottomtop, text='更新', width=10, height=1, bg='white', relief=GROOVE
                , command=lambda: update_info(frame_mainrightbot, cpulist))
bu8.pack(side=RIGHT, padx=20)

# 填充间隔
frame_seperator2 = tk.Frame(frame_mainbottom, width=2, bg="whitesmoke")
frame_seperator2.pack(fill=tk.Y)

root.mainloop()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867659.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号