def __init__(self, parent, back=None): """ Arguments: parent -- The parent tkinter object for this screen back -- None if there is no menu to go back to. Otherwise the menu that the back button should lead to. """ super().__init__() self.parent = parent # If we need a back button, load the icon and create the button. if back is not None: self.backImage = tk.PhotoImage( file=getResourcePath("assets/settings/back.png")) self.backButton = tk.Button( self, image=self.backImage, command=lambda: parent.changeMenu(back), borderwidth=0) self.backButton.grid(row=0, column=0, sticky="NW", pady=5, padx=5) # Create the exit button after loading the icon. self.exitImage = tk.PhotoImage( file=getResourcePath("assets/settings/exit.png")) self.exitButton = tk.Button(self, image=self.exitImage, command=self.exitMenu, borderwidth=0) self.exitButton.grid(row=0, column=0, sticky="NE", pady=5, padx=5)
def loadGUI(self): """ Method used to load the GUI aspects of the homescreen. Arguments: NONE """ self.titleImage = tk.PhotoImage( file=getResourcePath("assets/home/title.png")) self.title = ttk.Label(self, image=self.titleImage, text="Path Finding Thing", style="Title.TLabel") self.title.grid(row=0, column=0, pady=50) self.settingsImage = tk.PhotoImage( file=getResourcePath("assets/home/settings.png")) self.settingsButton = tk.Button( self, image=self.settingsImage, command=lambda: self.parent.changeMenu(MenuList), borderwidth=0) self.settingsButton.grid(row=0, column=0, sticky="NE", pady=5, padx=5) self.helpImage = tk.PhotoImage( file=getResourcePath("assets/home/help.png")) self.helpButton = tk.Button(self, image=self.helpImage, command=self.showHelp, borderwidth=0) self.helpButton.grid(row=0, column=0, sticky="NW", pady=5, padx=5) self.generateImage = tk.PhotoImage( file=getResourcePath("assets/home/generate.png")) self.generateButton = tk.Button(self, image=self.generateImage, command=self.generateMaze, borderwidth=0) self.generateButton.grid(row=1, column=0, pady=30) self.loadImage = tk.PhotoImage( file=getResourcePath("assets/home/load.png")) self.loadButton = tk.Button(self, image=self.loadImage, command=self.parent.loadMazeFile, borderwidth=0) self.loadButton.grid(row=2, column=0, pady=30) self.grid_rowconfigure(10, weight=100) self.footer = ttk.Label(self, text="Created By Felix J. Randle", style="Footer.TLabel") self.footer.grid(row=10, column=0, sticky="S", pady=(80, 0))
def createWidgets(self): self.backImage = tk.PhotoImage( file=getResourcePath("assets/help/back.png")).subsample(13, 13) tk.Button(self, image=self.backImage, borderwidth=0, command=self.previousPage).grid(row=0, column=0) self.nextImage = tk.PhotoImage( file=getResourcePath("assets/help/next.png")).subsample(13, 13) tk.Button(self, image=self.nextImage, borderwidth=0, command=self.nextPage).grid(row=0, column=2)
def __init__(self, parent): """ Arguments: parent -- The parent tkinter object for this screen. """ super().__init__(parent, MenuList) self.loadTitle(getResourcePath("assets/settings/solverTitle.png")) solvers = ("Recursive Backtracker", "Dijkstra's Algorithm", "A*") self.solverChoice = ttk.Combobox(self, values=solvers, state="readonly", width=20, font=("arial", 14)) self.solverChoice.set(solvers[2]) self.solverChoice.grid(row=2, column=0, pady=20) self.autoStepEnabled = True self.autoStepButton = ttk.Button(self, text="Disable AutoStep", style="Settings.TButton", command=self.toggleAutoStep) self.autoStepButton.grid(row=3, column=0, pady=20) self.speedsFrame = tk.Frame(self) self.speedsFrame.grid(row=4, column=0, pady=20) self.speedDisplay = ttk.Label(self.speedsFrame, text="Current Speed: X1", style="Subheading.TLabel") self.speedDisplay.grid(row=0, column=0, columnspan=1000) self.speeds = [1, 2, 5, 10, 50, 100] self.speedItems = {} for speed in self.speeds: image = tk.PhotoImage( file=getResourcePath("assets/speeds/X{}.png".format(speed))) button = tk.Button(self.speedsFrame, image=image, command=lambda x=speed: self.setSpeed(x), borderwidth=0) button.grid(row=1, column=speed) self.speedItems.update({speed: {"image": image, "button": button}}) self.speed = tk.DoubleVar() self.speed.set(1) self.speed.trace("w", self.updateLabel)
def main(): qApp = QtWidgets.QApplication(sys.argv) backend = Backend() configLoader = ConfigLoader() window = uis.MainWindow(backend, configLoader) backend.register_instrument(vna.Config, vna.Driver) configLoader.registerInstrument(vna.Config) window.registerInsturmentType( "Vna", vna.DataWindow, vna.ConfigWindow, QIcon(getResourcePath('images/networkAnalyser.png')), vna.Config({ 'model': 'simulated', 'segments': { 'TM010': { 'type': 'Electric', 'f0': 2500700000.0, 'span': 1000000.0, 'points': 201, 'ifbw': 1000.0, 'power': 0.0 } } })) backend.register_instrument(visaScript.Config, visaScript.Driver) configLoader.registerInstrument(visaScript.Config) window.registerInsturmentType( "visaScript", visaScript.DataWindow, visaScript.ConfigWindow, QIcon(getResourcePath('images/dcSupply.png')), visaScript.Config({'script': 'record_wait()\nlog("Record start")'})) backend.register_instrument(datalogger.Config, datalogger.Driver) configLoader.registerInstrument(datalogger.Config) window.registerInsturmentType( "Data Logger", datalogger.DataWindow, datalogger.ConfigWindow, QIcon(getResourcePath('images/dcSupply.png')), datalogger.Config({'model': '1365'})) window.show() if (len(sys.argv) > 1): window.openConfig(sys.argv[1]) sys.exit(qApp.exec_())
def __init__(self, parent): """ Arguments: parent -- The parent tkinter object for this screen. """ super().__init__(parent, MenuList) self.parent = parent self.loadTitle(getResourcePath("assets/settings/colourTitle.png")) self.loadWidgets()
def loadWidgets(self): """ Method for creating all the pages widgets """ self.exitImage = tk.PhotoImage( file=getResourcePath("assets/settings/exit.png")) self.exitButton = tk.Button( self, image=self.exitImage, command=lambda: self.parent.changeMenu(None), borderwidth=0) self.exitButton.grid(row=0, column=0, sticky="NE", pady=5, padx=5) self.ColourSettingsIcon = tk.PhotoImage( file=getResourcePath("assets/settings/colourTitle.png")) tk.Button(self, image=self.ColourSettingsIcon, borderwidth=0, command=lambda: self.parent.changeMenu(ColourSettings)).grid( row=0, column=0, pady=70, padx=40) self.SolverSettingsIcon = tk.PhotoImage( file=getResourcePath("assets/settings/solverTitle.png")) tk.Button(self, image=self.SolverSettingsIcon, borderwidth=0, command=lambda: self.parent.changeMenu(SolverSettings)).grid( row=5, column=0, pady=70, padx=40) self.GenerationSettingsIcon = tk.PhotoImage( file=getResourcePath("assets/settings/generationTitle.png")) tk.Button( self, image=self.GenerationSettingsIcon, borderwidth=0, command=lambda: self.parent.changeMenu(GenerationSettings)).grid( row=10, column=0, pady=70, padx=40)
def __init__(self, parent): super().__init__(parent) self.loadTitle(getResourcePath("assets/settings/solverTitle.png")) ttk.Label(self, text="Current Tile:", style="Header.TLabel").grid(row=1, column=0) self.currentTileLabel = ttk.Label(self, text="None", style="Subheading.TLabel") self.currentTileLabel.grid(row=2, column=0, pady=5) self.currentTile = tk.Button(self, width=2, height=1, bg="grey") self.currentTile.grid(row=3, column=0, pady=5) ttk.Label(self, text="Please click on a tile to select it", style="Subheading.TLabel").grid(row=5, column=0) availableTiles = ["WALL", "PATH", "START", "END"] currentRow = 10 firstItem = True for key, item in maze.tileColours.items(): if key.name in availableTiles: if firstItem: self.changeTile(key, key.name.title(), item) firstItem = False ttk.Label(self, text=key.name.title(), style="Subheading.TLabel").grid(row=currentRow, column=0, pady=5) tk.Button( self, width=2, height=1, bg=item[1], highlightbackground=item[0], command=lambda key=key, name=key.name.title( ), colours=item: self.changeTile(key, name, colours)).grid( row=currentRow + 1, column=0, pady=5) currentRow += 5
def __init__(self, parent): """ Arguments: parent -- The parent tkinter object for this screen. """ super().__init__(parent, MenuList) self.parent = parent # Load a Title button with the given file self.loadTitle(getResourcePath("assets/settings/generationTitle.png")) self.container = tk.Frame(self) self.container.grid(row=10, column=0, sticky="S") ttk.Label(self.container, text="Generation Algorithm", style="Header.TLabel").grid(row=1, column=0, pady=20) generators = ("Flood Fill", "Subchamber Division", "Kruskals Algorithm", "Blank Maze") self.algorithmChoice = ttk.Combobox(self.container, values=generators, state="readonly", width=20, font=("arial", 14)) self.algorithmChoice.current(2) self.algorithmChoice.grid(row=2, column=0, pady=20) ttk.Label(self.container, text="Maze Size", style="Header.TLabel").grid(row=3, column=0, pady=20) self.mazeSize = ttk.Scale(self.container, from_=21, to=75, orient=tk.HORIZONTAL, value=37, command=self.oddOnly, length=200) self.mazeSize.grid(row=4, column=0, pady=20) self.mazeSizeLabel = ttk.Label(self.container, text=51, style="Header.TLabel") self.mazeSizeLabel.grid(row=5, column=0, pady=20)
from PyQt5.QtCore import Qt, QVariant, QTime from PyQt5.QtWidgets import QTableWidgetItem from PyQt5.uic import loadUiType import pyqtgraph as pg import numpy as np import array from utils import float_to_si, getResourcePath from .driver import lorentz_fn DataWindowUi, DataWindowBase = loadUiType( getResourcePath('ui/vnaDataWindow.ui')) class DataWindow( DataWindowBase, DataWindowUi): def __init__(self, instrument, parent=None): DataWindowBase.__init__(self, parent) self.setupUi(self) self.instrument = instrument # Create plots self.frequencyPlot = pg.PlotItem(title="Frequency") self.frequencyPlot.setLabel("left", "change in Frequency", "Hz") self.frequencyPlot.setLabel("bottom", "Time (s)", "") self.qFactorPlot = pg.PlotItem(title="Q factor") self.qFactorPlot.setLabel("left", "change in Q factor") self.qFactorPlot.setLabel("bottom", "Time (s)", "") self.graph.addItem(self.frequencyPlot, 0, 0)
from utils import getResourcePath from PyQt5.QtCore import Qt, QAbstractProxyModel, QModelIndex from PyQt5.QtWidgets import QListWidgetItem from PyQt5.uic import loadUiType ConfigWindowUi, ConfigWindowBase = loadUiType( getResourcePath('ui/dataloggerConfigWindow.ui')) class ConfigWindow(ConfigWindowBase, ConfigWindowUi): def __init__(self, dataloggerConfig, parent=None): ConfigWindowBase.__init__(self, parent) self.setupUi(self) self.config = dataloggerConfig.clone() self.serialPort.textEdited.connect(self.serialPortTextEdited) self.deviceType.currentIndexChanged[str].connect( self.deviceTypeCurrentIndexChanged) self.serialPort.setText(self.config.serialPort) self.deviceType.setCurrentText(str(self.config.model)) def keyPressEvent(self, event): event.ignore() def serialPortTextEdited(self, text): self.config.serialPort = text def deviceTypeCurrentIndexChanged(self, text): self.config.model = text
from PyQt5.QtCore import Qt, QVariant, QTime from PyQt5.QtWidgets import QTableWidgetItem from PyQt5.uic import loadUiType from utils import float_to_si, getResourcePath DataWindowUi, DataWindowBase = loadUiType( getResourcePath('ui/visaScriptDataWindow.ui')) class DataWindow( DataWindowBase, DataWindowUi): def __init__(self, instrument, parent=None): DataWindowBase.__init__(self, parent) self.setupUi(self) self.instrument = instrument def addSample(self, elapsed, timestamp, sample): text = "{}: {}".format(timestamp.isoformat(), sample) self.logOutput.appendPlainText(text) def refresh(self): pass
def addPhoto(self, path): self.image = tk.PhotoImage(file=getResourcePath(path)).zoom( 2, 2).subsample(5, 5) self.imageShown = tk.Label(self, image=self.image) self.imageShown.grid(row=0, column=0, pady=10)
from utils import getResourcePath from PyQt5.uic import loadUiType from PyQt5.QtCore import QAbstractProxyModel, Qt from PyQt5.QtWidgets import QDialog, QListWidgetItem, QFileDialog import os from patch import useNativeDialog EditInstrumentsDialogUI, EditInstrumentsDialogBase = loadUiType( getResourcePath('ui/editInstrumentsDialog.ui')) class EditInstrumentsDialog(EditInstrumentsDialogBase, EditInstrumentsDialogUI): def __init__(self, instrumentConfig, instrumentInfo, configPath, parent=None): EditInstrumentsDialogBase.__init__(self, parent) self.setupUi(self) self.config = instrumentConfig.clone() self.instrumentInfo = instrumentInfo self.configPath = configPath self.loadInstrumentIcons() self.instrumentType.addItems( list(value.name for value in self.instrumentInfo.values()))
from utils import getResourcePath from PyQt5.QtCore import Qt, QAbstractProxyModel, QModelIndex from PyQt5.QtWidgets import QListWidgetItem from PyQt5.uic import loadUiType from .config import Segment ConfigWindowUi, ConfigWindowBase = loadUiType(getResourcePath('ui/vnaConfigWindow.ui')) class ConfigWindow( ConfigWindowBase, ConfigWindowUi): def __init__(self, vnaConfig, parent=None): ConfigWindowBase.__init__(self, parent) self._selectedSegment = None self.setupUi(self) self.config = vnaConfig.clone() self.segments.addItems(self.config.segments.keys()) for i in range(self.segments.count()): self.segments.item(i).setFlags(Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled) self.segments.currentRowChanged.connect(self.segmentsRowChanged) self.segments.itemChanged.connect(self.segmentsItemChanged) self.addSegment.clicked.connect(self.addSegmentClicked) self.removeSegment.clicked.connect(self.removeSegmentClicked) if len(self.config.segments): self.segments.setCurrentRow(0) self.segmentsRowChanged(0)
def __init__(self, parent): super().__init__(parent) self.loadTitle(getResourcePath("assets/settings/solverTitle.png")) self.autoStepControls = tk.Frame(self) self.autoStepControls.grid(row=1, column=0) self.play = tk.PhotoImage( file=getResourcePath("assets/solving/playButton.png")) self.playButton = tk.Button(self.autoStepControls, image=self.play, command=self.startAutoStep, borderwidth=0) self.playButton.grid(row=0, column=0) self.pause = tk.PhotoImage( file=getResourcePath("assets/solving/pauseButton.png")) self.pauseButton = tk.Button(self.autoStepControls, image=self.pause, command=self.stopAutoStep, borderwidth=0) self.pauseButton.grid(row=0, column=1) self.stop = tk.PhotoImage( file=getResourcePath("assets/solving/stopButton.png")) self.stopButton = tk.Button(self.autoStepControls, image=self.stop, command=self.stopSolve, borderwidth=0) self.stopButton.grid(row=0, column=2) self.speedsFrame = tk.Frame(self) self.speedsFrame.grid(row=4, column=0, pady=20) self.speedDisplay = ttk.Label(self.speedsFrame, text="Current Speed: X1", style="Subheading.TLabel") self.speedDisplay.grid(row=0, column=0, columnspan=1000) self.speeds = [1, 2, 5, 10, 50, 100] self.speedItems = {} for speed in self.speeds: image = tk.PhotoImage( file=getResourcePath("assets/speeds/X{}.png".format(speed))) button = tk.Button( self.speedsFrame, image=image, command=lambda x=speed: self.parent.solver.setSpeed(x), borderwidth=0) button.grid(row=1, column=speed) self.speedItems.update({speed: {"image": image, "button": button}}) self.stepButton = tk.Button(self, width=10, height=2, text="Step", command=self.step) self.stepButton.grid(row=10, column=0, pady=5) self.advancedInfo = tk.IntVar() self.advancedInfoButton = ttk.Checkbutton( self, text="Show Advanced Information?", variable=self.advancedInfo) self.advancedInfoButton.grid(row=11, column=0, pady=5) self.advancedInformationFrame = tk.Frame(self) self.advancedInformationFrame.grid(row=15, column=0, pady=10) self.advancedInformation = ttk.Label( self.advancedInformationFrame, text="Advanced Solver Information", style="Subheading.TLabel") self.advancedInformation.grid(row=0, column=0, pady=10) self.stepCount = tk.Label(self.advancedInformationFrame, text="Steps: 0", font=("Helvetica", 12, "bold italic")) self.stepCount.grid(row=1, column=0)
def __init__(self, *args, **kwargs): """Initialise Application class.""" super().__init__() # Set the Title and icon of our application. self.title("PathFinding") self.Title = "PathFinding" # Set default background and foreground colours for all widgets. self.tk_setPalette(background="#D9D9D9", foreground="#000000") # Set our programs icon for the top left. self.iconbitmap(getResourcePath("assets/maze.ico")) # Load in Database dirPath = os.path.join(os.environ['APPDATA'], 'PathFinding') if not os.path.exists(dirPath): os.makedirs(dirPath) filePath = os.path.join(dirPath, "userData.db") self.db = Database(filePath, maze.tileColours) # Add current user self.userID, colours = self.db.loginUser(os.getlogin()) # Stop the user from resizing the screen. self.screenSize = 750 # Take away 5 to account for border of screen so maze fits properly self.minsize(width=self.screenSize - 5, height=self.screenSize - 5) self.resizable(False, False) # Create all styles to be used for our GUI. self.loadStyles() # Ensure all placed items are centered. self.grid_columnconfigure(0, weight=1) # Create a dictionary for the screen tabs and populate it. self.frames = dict() # Load in all tabs and put them in our dictionary. self.frames[HomeScreen] = HomeScreen(self) self.frames[MazeScreen] = MazeScreen(self) # Load the homescreen self.changeFrame(HomeScreen) # Create a dictionary for the side menus and populate it. self.menus = dict() # Load in all menus and put them in our dictionary. self.menus[MenuList] = MenuList(self) self.menus[ColourSettings] = ColourSettings(self) self.menus[SolverSettings] = SolverSettings(self) self.menus[GenerationSettings] = GenerationSettings(self) self.menus[SolverMenu] = SolverMenu(self) self.menus[EditMenu] = EditMenu(self) # Load Maze self.loadMaze() # Load in Top Menu self.loadTopMenu() # Bind for Easter Egg self.EESequence = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65] self.EEPos = 0 self.bind("<Key>", self.keyPress)
from utils import getResourcePath from PyQt5.QtCore import Qt, QAbstractProxyModel, QModelIndex from PyQt5.QtWidgets import QListWidgetItem from PyQt5.uic import loadUiType ConfigWindowUi, ConfigWindowBase = loadUiType( getResourcePath('ui/visaScriptConfigWindow.ui')) class ConfigWindow(ConfigWindowBase, ConfigWindowUi): def __init__(self, visaScriptConfig, parent=None): ConfigWindowBase.__init__(self, parent) self.setupUi(self) self.config = visaScriptConfig.clone() self.resourceId.textEdited.connect(self.resourceIdTextEdited) self.script.textChanged.connect(self.scriptTextChanged) self.resourceId.setText(self.config.resource) self.script.setPlainText(self.config.script) def keyPressEvent(self, event): event.ignore() def resourceIdTextEdited(self, text): self.config.resource = text def scriptTextChanged(self): self.config.script = self.script.toPlainText()
from PyQt5.QtCore import Qt, QVariant, QTime from PyQt5.uic import loadUiType import pyqtgraph as pg import numpy as np import array from utils import float_to_si, getResourcePath DataWindowUi, DataWindowBase = loadUiType( getResourcePath('ui/dataloggerDataWindow.ui')) class DataWindow(DataWindowBase, DataWindowUi): def __init__(self, instrument, parent=None): DataWindowBase.__init__(self, parent) self.setupUi(self) self.instrument = instrument def addSample(self, elapsed, timestamp, sample): ch0 = sample[0] ch1 = sample[1] if self.instrument.config.model == '1316': self.raw0.setText("Tempearture 1: {:4.1f} Celcius".format(ch0)) self.raw1.setText("Tempearture 2: {:4.1f} Celcius".format(ch1)) else: self.raw0.setText("Tempearture: {:4.1f} Celcius".format(ch0)) self.raw1.setText("Relative humidity: {:4.1f}%".format(ch1)) def refresh(self): pass